【问题标题】:How to delete an object (class) through destructor method如何通过析构方法删除对象(类)
【发布时间】:2012-07-12 11:00:29
【问题描述】:

我想知道是否可以通过析构方法删除对象?

我的类的构造函数和析构函数:

class cal
{
    public:
        cal()
        {
            days = 0;
            day = 1;
            month = 1;
            year = 1300;
            leap = true;
        };
        ~cal()
        {
            delete this;
        }
}*calendar = new cal;

如何通过类删除这个指针?

附言

我忘了写下面的代码

cal *calandar = new cal[];

我想在堆而不是堆栈中使用它

我想经常使用这个类(对象)(很多那个对象)想象我应该写多少次 delete 并且它很难理解,故障排除和跟踪代码我希望它们被自动销毁(在堆中)

当我执行“delete[] calendar”时,我在课堂上使用了以下代码,它减少了我占用的内存(使用的内存量)它是否通过退出程序正常工作(销毁所有对象)?因为我使用 GNU/Linus,它会破坏所有带有或不带有该行的对象,我担心会在 windows 中泄漏

void DisposeObject() { delete this; }

【问题讨论】:

  • 为什么需要?为什么不让调用代码删除你的对象?
  • 如果您想为用户省去麻烦,请不要打扰!如果他们对此感兴趣,他们应该使用智能指针。
  • 也许可以,但使用它们不是强制。并且有些人会使用delete这个词
  • @chris 删除this没有错;这是一个常见的成语。但是你不想在析构函数中这样做。
  • @JamesKanze,除了Release() 方法之外,它还用于其他任何地方吗?我从来没有见过它以其他方式使用。

标签: c++ class destructor


【解决方案1】:

我想知道是否可以通过析构方法删除对象

即使假设这是有效的 - 问题是没有任何东西会调用析构函数,所以这永远不会产生影响。当调用代码删除对象时调用析构函数,这反过来可以根据需要删除任何内部对象。

在您的情况下,您似乎不需要在析构函数中做任何事情,但是,因为您没有分配任何需要明确删除的资源(至少在您显示的内容中) .

【讨论】:

    【解决方案2】:

    没有。在调用析构函数时,对象已经被销毁,所以delete this 无效。

    行为未定义,但很可能会递归调用析构函数,导致堆栈溢出。

    【讨论】:

    • 删除这个;已经定义了结果,只要您确保对象是动态分配的,并且(当然)永远不要在对象被销毁后尝试使用它。 stackoverflow.com/questions/3150942/c-delete-this
    • @SergeyK.:但是delete this 在析构函数中无效,因为它已经被销毁了。
    • 当然,但这不是一般情况。
    • @SergeyK.:不,我只是在回答被问到的问题:“是否可以通过析构函数删除对象”,并举例说明了包含delete this 的析构函数。一般情况与该问题无关。
    • 问题是——“我怎样才能通过类删除这个指针”
    【解决方案3】:

    你可以这样写代码:

    class cal
    {
        public:
            cal()
            {
            };
            ~cal()
            {
            }
            void DisposeObject()
            {
               delete this;
            }
    }
    

    它会调用你的析构函数。

    你不应该从你的析构函数中调用delete this,因为它会递归调用析构函数,可能导致堆栈溢出。无论如何,您编写的代码存在未定义行为

    请参阅此问题进行深入讨论:Is delete this allowed?

    【讨论】:

    • 但是有什么意义呢?而不是仅仅删除对象?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 2023-03-24
    • 2016-06-14
    相关资源
    最近更新 更多