如果我有:
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
?
答案 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。 (*)