MSDN说无法复制unique_ptr,所以如果我将一个unique_ptr对象分配给地图如下,那么内部的对象应该被销毁......
#include "stdafx.h"
#include <memory>
#include <map>
struct STest
{
~STest() {
nID = 10;
}
int nID;
};
int _tmain(int argc, _TCHAR* argv[])
{
std::map<int, std::unique_ptr<STest> > setp;
setp[0] = std::make_unique<STest>(); // Object should be destroyed, but it is not.
setp[0]->nID = 0;
return 0;
}
答案 0 :(得分:1)
std_unique_ptr
无法复制,但可以移动。如果源是 rvalue ,则将一个std::unique_ptr
分配给另一个移动对象指针的所有权。
将所有权从
r
转移到*this
,就像调用reset(r.release())
,然后从get_deleter()
分配std::forward<E>(r.get_deleter())
一样。...
请注意,unique_ptr的赋值运算符仅接受rvalues ,它们通常由std :: move生成。 (unique_ptr类显式删除其左值复制构造函数和左值赋值运算符。)
因此,在您的情况下,您将std::make_shared()
返回的临时对象(rvalue)分配给std::unique_ptr
中的std::map
,因此可以安全地转移对象指针的所有权
如果您尝试使用变量(左值),则不应编译赋值。
std::unique_ptr<STest> p = std::make_unique<STest>();
setp[0] = p; // <-- error!