假设我在调用堆栈中有类似的东西:
主() - >类方法() - > 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)并且它从未坠毁过。 我真的很幸运,应该避免这样做吗?
答案 0 :(得分:1)
在删除对象后,访问对象的任何成员变量是导致未定义的行为的原因。不,在删除对象后访问X
成员是不安全的。
答案 1 :(得分:1)
从已删除实例中读取任何值的结果是未定义的。它可能不会崩溃,但它可以读取垃圾(在同一个地方分配的另一个实例的数据)。
顺便说一下。你可以安全地做同样的事情。