C ++调用堆栈 - 执行返回已删除的对象

时间:2015-02-09 01:50:49

标签: c++ destructor

假设我在调用堆栈中有类似的东西:

主() - >类方法() - > someFunction()

someFunction()删除使用new运算符分配的类,然后返回。 如果类具有在析构函数中设置为true的bool属性X,那么在someFuntion()返回后立即读取它是否安全?像这样:

SomeClass::~SomeClass() { X = true; }
void SomeClass::classMethod()
{
   someFunction(); // deletes this class object
   if(X) return;
   //something else
}

我使用valgrind运行类似的代码,并在访问X属性时报告“无效读取”,这并不令人惊讶。

问题是,我经常跑了很多次(也许~30 - 50)并且它从未坠毁过。 我真的很幸运,应该避免这样做吗?

2 个答案:

答案 0 :(得分:1)

在删除对象后,访问对象的任何成员变量是导致未定义的行为的原因。不,在删除对象后访问X成员是不安全的。

答案 1 :(得分:1)

从已删除实例中读取任何值的结果是未定义的。它可能不会崩溃,但它可以读取垃圾(在同一个地方分配的另一个实例的数据)。

顺便说一下。你可以安全地做同样的事情。