这是否为shared_ptr分配新内存?

时间:2014-06-09 22:44:32

标签: c++ memory-management shared-ptr smart-pointers

如果我有:

std::unordered_map<std::string, std::shared_ptr<M>> map;
.
.
.
.
while(something){
    std::shared_ptr<M> t = map[key];
    .
    .
}

我现在有两个shared_ptr<M> s-one仍然包含在unordered_map中,还有一个名为t的副本?因此,我还将在堆上有两个引用计数对象(一个用于t,一个用于map[key])和两个M内存分配?

换句话说,与map[key]相关的所有内存都已被复制用于t

2 个答案:

答案 0 :(得分:3)

基本上,你有

std::shared_ptr<M> t = foo();
std::shared_ptr<M> t2 = t;
assert(t.get() == t2.get()); // they point to the same data.

所以你没有为M分配另一个分配。你刚刚将引用计数增加了一个。

答案 1 :(得分:0)

不会复制M对象,只会复制此对象的指针。 您只有一个带有引用计数&#39; 2&#39;的M对象。 不要担心复制,为此目的存在shared_ptr。 (*)