将一个 shared_ptr 分配给另一个

win*_*ght 6 shared-ptr c++11

将一个共享指针分配给另一个共享指针是否会释放后者管理的内存?让

typedef shared_ptr<char> char_ptr_t;
char_ptr_t pA(new char('A'));
char_ptr_t pB(new char('B'));
Run Code Online (Sandbox Code Playgroud)

现在,下面的语句是否释放了 'A'

/*1*/ pA = pB;
Run Code Online (Sandbox Code Playgroud)

还是我需要明确释放它:

/*2*/ pA.reset();
/*3*/ pA = pB;
Run Code Online (Sandbox Code Playgroud)

并且,以下代码对于实现相同是否有效?

/*4*/ pA.reset(pB); //<-- is this valid? Not compiling in MSVC++ 2010, though the standard seems to allow it.
Run Code Online (Sandbox Code Playgroud)

Joh*_*esD 6

是的,pA不指向字符'A',因此引用计数递减。由于它是对 的唯一引用'A',因此引用计数达到零并且字符被删除。如果您必须在重新分配之前显式释放引用,那将是非常令人惊讶且容易出错的。

pA.reset(pB)不应该编译,因为reset只能采用原始指针,而不是另一个shared_ptr.

  • @winterlight:因为您可能会忘记重置它,就像您可能会忘记“删除”原始指针一样。`shared_ptr`(和 `unique_ptr`)的重点是让编码人员不必记住手动完成可以自动完成的事情。 (4认同)