gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:42:42 31 4
gpt4 key购买 nike

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

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

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com