为什么unique_ptr的对象包装器在将其分配给地图后没有被销毁?

时间:2016-06-10 00:43:51

标签: c++

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;
}

1 个答案:

答案 0 :(得分:1)

std_unique_ptr无法复制,但可以移动。如果源是 rvalue ,则将一个std::unique_ptr分配给另一个移动对象指针的所有权。

std::unique_ptr::operator=

  

将所有权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!