c++ - shared_ptr、vector、emplace_back 和外部使用指针

标签 c++ pointers vector heap-memory

我正在开发一个将生成一些代码的应用程序,速度不是问题,但我不希望内存泄漏。

我对来自具有垃圾收集器的其他语言的 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/

相关文章:

c++ - 重载运算符帮助?

c++ - Mac OSX 上 Qt App 中完全随机的 malloc 错误

c++ - QRegExp : search a pattern that does not contain another pattern

r - 查找最近的较小数字

matlab - 如何创建接受向量的多项式?

c++ - C++中从-10到10的随机数

pointers - 在子例程中分配数组并将其传回时,FORTRAN 中的内存泄漏问题

C++从基类指针访问派生类成员

c++ - cout 指向数组项的指针打印出的值与预期不同

c++ - GLSL 变换反馈返回数组与 vector