如果我有以下代码:
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 的原始对象是否仍然存在?
在初始化期间创建的对象会发生什么
r
?
没有什么。
它仍然有效吗?
是的。
你是怎么做到的
delete
?
你不能。您只是丢失了指向它的唯一指针。它将在程序的剩余生命周期中潜伏在后台(甚至在某些原始操作系统上)。这称为内存泄漏。
这是不使用原始指针来管理资源的众多充分理由之一。如果你使用智能指针,就不会有泄漏。new
除非您确实需要动态分配,否则这也是避免的一个很好的理由。
这不会使两者都无效
q
吗r
?
是的。删除一个对象会使所有指向它的指针失效。这是不使用原始指针的另一个很好的理由:无法判断它们已失效。
您的问题的答案是:
您现在无法删除该对象,因为无论如何您都没有引用它,从而导致内存泄漏。(尝试使用智能指针)
除非您有一个指向它的指针,否则您不能删除该对象。
删除一个对象会使所有指向该对象的指针失效。
此分配将导致内存泄漏:
r = q;
先前指向的内存r
仍然有效,但您不再有指向它的指针,也不能delete
。delete
在这一点上调用q
或r
将使两者都无效。