最近,我将原始指针更改为在容器中使用std::shared_ptr,如下所示:
std::vector<std::shared_ptr<AbstractPathContainer>> mGeneratedPaths;当我在这个容器上调用clear()时,它会在其中的每个std::shared_ptr上调用reset()方法吗?
发布于 2018-05-21 11:38:29
不,它会打电话给破坏者。析构函数将减少每个智能指针的引用计数,如果它将带至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将不会从堆中删除。
发布于 2018-05-21 11:34:53
否;它将调用每个指针上的析构函数(可能调用也可能不调用reset())。
如果你的问题真的是“如果适当的话,我的记忆会被释放吗?”然后回答是肯定的;ref计数将根据每个共享ptr对象的需要进行调整,如果为0,则将删除该对象。
https://stackoverflow.com/questions/50447907
复制相似问题