7

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

我的班级的构造函数和析构函数:

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 并且它很难理解,故障排除和跟踪代码我希望它们被自动销毁(在堆中)

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

void DisposeObject() { delete this; }
4

3 回答 3

14

不。在调用析构函数时,对象已经被销毁,因此delete this无效。

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

于 2012-07-12T16:20:54.027 回答
11

你可以这样写代码:

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

它会调用你的析构函数。

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

请参阅此问题进行深入讨论:是否允许删除?

于 2012-07-12T16:21:31.357 回答
3

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

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

在您的情况下,您似乎不需要在析构函数中执行任何操作,但是,因为您没有分配任何需要显式删除的资源(至少在您显示的内容中)。

于 2012-07-12T16:20:22.983 回答