2

如果我有以下代码:

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

r现在将指向与q. 在初始化期间创建的对象会发生什么r?它仍然有效吗?你是怎么做到的delete

我知道这样写:

delete q;

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

delete r;

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

即使它这样做了int,价值 100 的原始对象是否仍然存在?

4

3 回答 3

7

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

没有什么。

它仍然有效吗?

是的。

你是怎么做到的delete

你不能。您只是丢失了指向它的唯一指针。它将在程序的剩余生命周期中潜伏在后台(甚至在某些原始操作系统上)。这称为内存泄漏

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

这不会使两者都无效qr

是的。删除一个对象会使所有指向它的指针失效。这是不使用原始指针的另一个很好的理由:无法判断它们已失效。

于 2013-09-11T17:17:42.470 回答
2

您的问题的答案是:

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

  2. 除非您有一个指向它的指针,否则您不能删除该对象。

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

于 2013-09-11T17:18:34.043 回答
1

此分配将导致内存泄漏:

r = q;

先前指向的内存r仍然有效,但您不再有指向它的指针,也不能deletedelete在这一点上调用qr将使两者都无效。

于 2013-09-11T17:18:47.773 回答