【问题标题】:How do shared_ptr react when assigned a new variable?shared_ptr 在分配新变量时如何反应?
【发布时间】:2020-03-10 12:46:32
【问题描述】:

你好 stackoverflow 的成员,

我目前正在尝试使用 c++(主要使用 C# 进行编程),并且想知道使用共享指针时的内存管理。

我有一个基本上从文本文件中读取一堆变量的类:

constructor(string file){
//..do stuff with file

s = new string(valuefromfile);
array_i = new int{value1, value2}
}
private:
shared_ptr<string> s;
shared_ptr<int*> array_i;

据我所知,共享指针有助于内存分配/泄漏,因为一旦所有指针不再存在,分配的内存将被释放,而无需我手动解除分配它们,例如调用类解构器,或者在子例程中使用。

现在我的问题是

如果我用类读入一个新文件,“s”和“array_i”将获得新值:

void readnewfile(string file){
//...do stuff with file
s = new string(newstring);
i = new int{ newvalue1, newvalue2, newvalue3 };
}

现在这些智能指针不再引用初始值。这是否意味着内存已被释放,还是我必须注意一些特定的事情以防止内存泄漏?

问候

【问题讨论】:

  • 共享指针使用引用计数。如果共享指针被覆盖,旧内容的引用计数会减少(如果有的话)。如果达到 0,则删除指针。 (我称之为“最后一个离开会关灯。”-原则。)但是,请看一下std::make_shared(),它是new 的更好替代std::shared_ptr
  • 您根本不需要智能指针。 std::string 成员和 std::vector&lt;int&gt; 成员应该是您所需要的。恕我直言,C++ 比 C# 更复杂、更微妙。如果你是 C++ 新手,我建议你忘记 C# 并给自己一个 good C++ book,这样你就可以看到 C++ 的编程方法,就像在使用多态性时才真正需要指针一样。
  • 在现代 C++ 中,您应该很少需要使用 new(也不是 malloc)。自从 C++11 出现以来,我还没有在我当前的代码库中使用 newstd::shared_ptr 很像 C#/.NET 内存管理,但在 C++ 中,它应该是你最后的“去”选择,只是因为你可以使用它。首选std::unique_ptrstd::vectorstd::string
  • new int{value1, value2} 创建 一个 整数。如果你想要两个,你应该写new int[2] {value1, value2}。请注意,它需要std::shared_ptr&lt;int[ ]&gt;

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


【解决方案1】:

感谢 Scheff 回答我的问题:

共享指针使用引用计数。如果共享指针被覆盖,旧内容的引用计数会减少(如果有的话)。如果达到 0,则删除指针。 (我称之为“最后一个离开会关灯。”-原则。)但是,请看一下 std::make_shared(),它是 std::shared_ptr 的新替代品。 – 舍夫

感谢 NathanOliver 的回答:

您根本不需要智能指针。一个 std::string 成员和一个 std::vector 成员应该是你所需要的。恕我直言,C++ 比 C# 复杂和微妙得多。如果您是 C++ 新手,我建议您忘记 C#,并为自己准备一本好的 C++ 书籍,这样您就可以了解 C++ 的编程方法,就像指针仅在使用多态性时才需要。 – 内森奥利弗

是的,向量比每次都重新定义数组要好得多,当我读入一个新文件时 myvector.clear();似乎可以做到没有任何泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2023-02-24
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2014-12-07
    相关资源
    最近更新 更多