我正在开发一个将生成一些代码的应用程序,速度不是问题,但我不希望内存泄漏。
我对来自具有垃圾收集器的其他语言的 shared_ptr 有点困惑。
如果我基本上理解正确的话,如果我在每个指针上使用 shared_ptr,它将以与垃圾收集器类似的方式运行,因为它会在对象不再被引用时将其移除。
当我在 shared_ptr 的 vector 中使用 emplace_back 时,我很困惑会发生什么。假设我有这个功能:
void fun(MyObject* o){
std::vector<std::shared_ptr<MyObject>> v;
v.emplace_back(o);
}
现在我创建一个指针并调用函数:
MyObject* o = new MyObject();
fun(o);
//Is o still here?
o 会发生什么? emplace_back 以某种方式从我的裸指针创建了一个 shared_ptr,当 vector 超出范围时它会删除 o 吗?
我想正确的方法是 shared_ptr 一切,如果我不关心性能但代码看起来很糟糕......
编辑:我知道它按预期工作。对于我的应用程序,我想我会选择旧的新的并删除。该应用程序是一棵具有不同节点的树,因此在最后调用 delete 应该从上到下安全地调用每个子节点 delete。
最佳答案
What happens with o?
它变成了一个悬挂指针,因为 shared_ptr
的析构函数删除了它指向的对象。但这只是因为你的 vector 被破坏了(因为它超出了范围)。如果您的 vector 没有被销毁,那么 o
仍将指向分配的对象,该对象现在将由 vector 中的共享指针管理。
I guess the proper way is to shared_ptr everything if I dont care about perfomance but code will look so bad...
不,正确的方法是学习如何正确使用 C++,而不仅仅是尝试塞入您从其他语言中学到的习语。别担心,如果您愿意,您仍然可以编写低效的代码。
关于c++ - shared_ptr、vector、emplace_back 和外部使用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47242206/