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

时间:2018-05-21 11:30:20

标签: c++ shared-ptr reset smart-pointers stdvector

我最近将原始指针更改为在这样的容器中使用std::shared_ptr

std::vector<std::shared_ptr<AbstractPathContainer>> mGeneratedPaths;

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

2 个答案:

答案 0 :(得分:6)

没有;它将在每个指针上调用析构函数(可能会或可能不会调用reset())。

如果你的问题确实存在,那么,如果合适,我的记忆会被释放吗?&#34;然后答案是肯定的;将根据每个共享ptr对象的需要调整引用计数,如果它为0,则该对象将被删除。

答案 1 :(得分:4)

不,它会调用析构函数。析构函数将减少每个智能指针的引用计数,如果它带来0然后析构函数调用自由函数(默认情况下这是删除包装器)。所以,如果你做了类似的事情:

std::vector<std::shared_ptr<AbstractPathContainer>> mGeneratedPaths ({c1, std::shared_ptr<AbstractPathContainer>(new AbstractPathContainerImpl())  });
std::shared_ptr<AbstractPathContainer> smartRef = mGeneratedPaths[0];
 mGeneratedPaths.clear();

smartRef不会从堆中删除。