如果我有以下一段代码:
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
的一个很好的理由,除非您确实需要动态分配。
这不会使
q
和r
都无效吗?
是的。删除对象会使指向该对象的所有指针失效。这是不使用原始指针的另一个很好的理由:没有办法知道它们已被失效。
您的问题的答案是:
- 您
现在无法删除该对象,因为您无论如何都不会引用它,从而导致内存泄漏。尝试使用智能指针)
除非有指针引用该对象,否则无法删除该对象。
删除对象会使指向该对象的所有指针失效。
此分配将导致内存泄漏:
r = q;
之前r
指向的内存仍然有效,但您不再有指向它的指针,也无法delete
它。此时在q
或r
上调用delete
将使两者无效。