【问题标题】:Does this allocate new memory for the shared_ptr?这是否为 shared_ptr 分配新内存?
【发布时间】:2014-06-09 22:44:32
【问题描述】:

如果我有:

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

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

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

【问题讨论】:

  • 你不能用int表达式map[key]初始化shared_ptr
  • map[key]int&amp;,而不是 shared_ptr&lt;M&gt;
  • std::unordered_map 并不意味着您必须以与std::map 不同的顺序传递模板参数^_^。
  • 对不起,我的电线被打断了-已更新问题。

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


【解决方案1】:

基本上,你有

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

因此您没有为M 分配另一个分配空间。您刚刚将 ref 计数增加了 1。

【讨论】:

    【解决方案2】:

    M 对象不会被复制,只会复制该对象的指针。 您只有一个引用计数为“2”的 M 对象。 不用担心复制,shared_ptr 就是为此目的而存在的。 (*)

    【讨论】:

      猜你喜欢
      • 2013-12-02
      • 2016-06-19
      • 1970-01-01
      • 2021-12-30
      • 2020-03-14
      • 2020-04-24
      • 1970-01-01
      相关资源
      最近更新 更多