首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将清除共享智能指针上的呼叫重置。

将清除共享智能指针上的呼叫重置。
EN

Stack Overflow用户
提问于 2018-05-21 11:30:19
回答 2查看 862关注 0票数 0

最近,我将原始指针更改为在容器中使用std::shared_ptr,如下所示:

代码语言:javascript
复制
std::vector<std::shared_ptr<AbstractPathContainer>> mGeneratedPaths;

当我在这个容器上调用clear()时,它会在其中的每个std::shared_ptr上调用reset()方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-21 11:38:29

不,它会打电话给破坏者。析构函数将减少每个智能指针的引用计数,如果它将带至0,则析构函数调用空闲函数(默认情况下,这是删除包装器)。如果你做了这样的事情:

代码语言:javascript
复制
std::vector<std::shared_ptr<AbstractPathContainer>> mGeneratedPaths ({c1, std::shared_ptr<AbstractPathContainer>(new AbstractPathContainerImpl())  });
std::shared_ptr<AbstractPathContainer> smartRef = mGeneratedPaths[0];
 mGeneratedPaths.clear();

smartRef将不会从堆中删除。

票数 4
EN

Stack Overflow用户

发布于 2018-05-21 11:34:53

否;它将调用每个指针上的析构函数(可能调用也可能不调用reset())。

如果你的问题真的是“如果适当的话,我的记忆会被释放吗?”然后回答是肯定的;ref计数将根据每个共享ptr对象的需要进行调整,如果为0,则将删除该对象。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50447907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档