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