澄清动态记忆

Mar*_*ars 2 c++ pointers

如果我有以下代码:

int *q = new int(42), *r = new int(100);
r = q;
Run Code Online (Sandbox Code Playgroud)

r现在将指向相同的动态分配对象q.在初始化期间创建的对象会发生什么r?它仍然有效吗?你delete好吗?

我知道写作:

delete q;
Run Code Online (Sandbox Code Playgroud)

将使q和r无效.如果我做了:

delete r;
Run Code Online (Sandbox Code Playgroud)

这不会使q和r无效吗?

即使它确实不会int有价值100 的原始对象仍然悬挂?

Mik*_*our 7

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

没有.

它仍然有效吗?

是.

delete好吗?

你不能.你刚丢失了它的唯一指针.它将潜伏在程序生命周期的其余部分(甚至超出某些原始操作系统)的后台.这称为内存泄漏.

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

不会这样既无效qr也?

是.删除对象会使指向它的所有指针无效.这是不使用原始指针的另一个好理由:没有办法告诉它们已经失效了.