澄清动态记忆

时间:2013-09-11 17:16:00

标签: c++ pointers

如果我有以下代码:

int *q = new int(42), *r = new int(100);
r = q;

r现在将指向与q相同的动态分配对象。在r初始化期间创建的对象会发生什么?它仍然有效吗?你是如何delete的?

我知道写作:

delete q;

将使q和r无效。如果我这样做了:

delete r;

这不会使q和r同时失效吗?

即使它确实不会使值为100的原始int对象仍然闲置?

3 个答案:

答案 0 :(得分:7)

  

在初始化r期间创建的对象会发生什么?

没有

  

它仍然有效吗?

  

你是如何delete的?

你做不到。你刚丢失了它的唯一指针。它将潜伏在程序生命周期的其余部分(甚至超出某些原始操作系统)的后台。这称为内存泄漏

这是不使用原始指针来管理资源的众多好理由之一。如果你使用智能指针,就不会有泄漏。除非您确实需要动态分配,否则这也是避免new的理由。

  

这不会使qr同时失效吗?

是。删除对象会使指向它的所有指针无效。这是不使用原始指针的另一个好理由:没有办法说明它们已被无效。

答案 1 :(得分:2)

您的问题的答案是:

  1. 您现在无法删除该对象,因为无论如何都不会引用该对象,从而导致内存泄漏。(尝试使用智能指针)

  2. 除非您有指向它的指针,否则无法删除该对象。

  3. 删除对象会使指向该对象的所有指针无效。

答案 2 :(得分:1)

此分配将导致内存泄漏:

r = q;

r之前指向的内存仍然有效但您不再有指向它的指针而不能delete它。此时在deleteq上拨打r会使两者无效。