我遇到了一些奇怪的问题。我在类方法中使用了delete运算符,我想知道如何解决这个问题。
这是代码:
#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();
}
如何检查删除操作符是否删除了数据? 它甚至可能吗?
答案 0 :(得分:4)
使用delete this;
几乎总是“糟糕”。有例外,但这些都是不寻常的。想想你想要做什么。大多数情况下,这意味着您应该有一个包装器对象和一个由包装器对象创建/删除的内部对象。
您无法检查是否已删除某些内容(以可靠的方式/便携方式)。在您的特定测试用例中,您通过“在被销毁后使用对象”来执行“未定义的行为”,这意味着您无法确切地知道将要发生什么。您必须信任delete
在标签上执行的C ++运行时。
答案 1 :(得分:2)
在C ++中,还有其他可用的返回值,而不是void
。因此,action
可以返回指示是否已删除this
的内容。
请注意,删除this
后,您不应访问任何非静态数据成员或调用任何非静态成员函数。有些人觉得很难保证,所以他们完全禁止delete this
。
对于C++ FAQ声称delete this
是合法构造且我没有发现任何禁止任何内容的反对者请注意。