【发布时间】:2015-07-28 03:31:48
【问题描述】:
我相信我刚刚经历的被称为“未定义的行为”,但我不太确定。基本上,我在包含类地址的外部范围中声明了一个实例。在内部层中,我在 stack 上实例化了一个对象,并将该实例的地址存储到持有者中。
内部作用域逃逸后,我检查是否仍可以访问已删除实例的方法和属性。令我惊讶的是,它没有任何问题。
有没有简单的方法来解决这个问题?有没有办法可以从列表中清除已删除的指针?
示例:
std::vector<int*> holder;
{
int inside = 12;
holder.push_back(&inside);
}
cout << "deleted variable:" << holder[0] << endl;
【问题讨论】:
-
我相信这是未定义的行为;因为运行时没有换出内存中的页面或在同一个地方分配一个新的堆栈帧,其中一个变量覆盖了
inside。 -
为了澄清,在这个例子中你使用堆栈分配变量
inside,但是你在你的问题中说你的对象是在堆上分配的。如果你堆分配一个对象,它会一直存在,直到你在它上面调用delete,因此没有未定义的行为。如果要模拟堆分配,请将示例中的int inside = 12;更改为int* inside = new int; *inside = 12;(需要注意的是,稍后您需要将其更改为delete。 -
是否有充分的理由将地址放入列表中?因为一个简单的解决方法是避免这样做。
-
如果我想解决这个问题,我想我的代码过于复杂了。如果非指针要进出范围,我无论如何都不应该添加它们..
-
这个例子过于简单了。它没有证明这个问题。另外,您从未提及:您是否从堆中释放了实例?