我最近将原始指针更改为在这样的容器中使用std::shared_ptr
:
std::vector<std::shared_ptr<AbstractPathContainer>> mGeneratedPaths;
当我在此容器上调用clear()
时,是否会在其中的每个reset()
上调用std::shared_ptr
方法?
答案 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
不会从堆中删除。