【发布时间】: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<int>成员应该是您所需要的。恕我直言,C++ 比 C# 更复杂、更微妙。如果你是 C++ 新手,我建议你忘记 C# 并给自己一个 good C++ book,这样你就可以看到 C++ 的编程方法,就像在使用多态性时才真正需要指针一样。 -
在现代 C++ 中,您应该很少需要使用
new(也不是malloc)。自从 C++11 出现以来,我还没有在我当前的代码库中使用new。std::shared_ptr很像 C#/.NET 内存管理,但在 C++ 中,它应该是你最后的“去”选择,只是因为你有可以使用它。首选std::unique_ptr和std::vector和std::string。 -
new int{value1, value2}创建 一个 整数。如果你想要两个,你应该写new int[2] {value1, value2}。请注意,它需要std::shared_ptr<int[ ]>。
标签: c++ memory-management smart-pointers