0

我遇到了一些奇怪的问题。我在类方法中使用删除运算符,我想知道如何解决这个问题。

这是代码:

#include <iostream>

using namespace std;

class A
{
    public:
        int a;

        ~A() {
            cout << "call ~A()" << endl;
        }

        void action()
        {
            /* code here */
            delete this; //this line depends on some if statements
            /* code here */
        }

        void test2() {
            cout << "call test2()" <<  a << endl;
        }

        void test() {
            a = 10;
            cout << "call test()" << endl;

            action();

            //how can I check if data is deleted?
            test2();
        }
};

int main()
{

    A* a = new A();
    a->test();

}

如何检查删除操作员是否删除了数据?甚至可能吗?

4

2 回答 2

4
  1. 使用delete this;几乎总是“坏的”。有例外,但那些真的很不寻常。想想你想要做什么。大多数情况下,这意味着您应该有一个包装器对象和一个由包装器对象创建/删除的内部对象。

  2. 您无法检查是否已删除某些内容(以可靠的方式/便携方式)。在您的特定测试用例中,您正在通过“在对象被破坏后使用它”来执行“未定义的行为”,这意味着您无法真正知道会发生什么。您必须相信 C++ 运行时delete会按照标签上的说明进行操作。

于 2013-07-27T11:09:09.157 回答
2

在 C++ 中,还有其他可用的返回值,而不是void. 因此,您action可以返回指示是否this已被删除的内容。

请注意,您不应在删除后访问任何非静态数据成员或调用任何非静态成员函数this。有些人觉得很难保证,所以他们完全禁止delete this

请注意C++ FAQ声称这delete this是合法构造的反对者,我也没有发现任何禁止它的东西。

于 2013-07-27T11:09:49.447 回答