删除已删除的对象

时间:2015-07-03 04:31:40

标签: c++

如果我们删除一个对象然后尝试通过已删除的指针访问一个对象怎么办?我找到了以下内容:

  

在对象的生命周期开始之前但在存储之后   该对象占用的位置已经分配,​​之后   对象的生命周期已经结束,之前的存储空间已经结束了   对象占用被重用或释放,任何引用的指针   可以使用对象将位于或位于的存储位置   但只能以有限的方式

     

[...]

     

- 对象将是或具有非平凡析构函数的类类型,并且指针用作a的操作数   删除表达,

但这不是我正在寻找的情况。如果存储已被释放或重用,会发生什么?标准是否解释了这种情况?

4 个答案:

答案 0 :(得分:6)

"未定义的行为"必须从标准回答。 但是标准的说法不要这样做。只有没有收获才会让你感到麻烦:)

答案 1 :(得分:3)

如果内存已经释放然后重新分配,那么理论上没有任何损害,但重新分配不太可能为您的指针类型提供可用的内存块。即使是这种情况,你也会有奇怪/复杂的行为,因为你的指针会看到不同的对象(某种易失性对象?)。

我绝对不会依赖这样的行为,除非您需要/想要自己管理内存(例如放置新内容)......

答案 2 :(得分:2)

如果我正确理解了您的问题,您是否想知道信息是否仍然可以访问,即使它已被解除分配?

我会说没有保证。释放后,存储在堆栈中的任何内容都不再受到保护。 "限制使用"最有可能是指在重新分配后立即访问。即使这样,也存在数据损坏和分段错误的风险。

我希望这能回答你的问题。

答案 3 :(得分:2)

C ++ 03在3.7.3.2/4(释放函数)中介绍了这一点。当存储对象的内存被释放时,所有指向该内存的指针都会失效,之后它们就不能被使用 - 它们不能被解除引用,不能被强制转换(seriously!!!),甚至不能打印(不,不开玩笑),做任何这些产生未定义的行为。你可以对这些指针做的唯一两件事就是为它们分配一个空指针或为它们指定一个有效的指针。