关于动态内存的说明



如果我有以下一段代码:

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对象是否仍然徘徊?

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

无。

它仍然有效吗?

是的。

你怎么delete

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

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

这不会使qr都无效吗?

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

您的问题的答案是:

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

  2. 除非有指针引用该对象,否则无法删除该对象。

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

此分配将导致内存泄漏:

r = q;

之前r指向的内存仍然有效,但您不再有指向它的指针,也无法delete它。此时在qr上调用delete将使两者无效。

最新更新