将清除共享智能指针上的调用重置
Will clear call reset on shared smart pointer
我最近更改了我的原始指针以在这样的容器中使用 std::shared_ptr
:
std::vector<std::shared_ptr<AbstractPathContainer>> mGeneratedPaths;
当我在此容器上调用 clear()
时,它会在其中的每个 std::shared_ptr
上调用 reset()
方法吗?
否;它将在每个指针上调用析构函数(可能调用也可能不调用 reset()
)。
如果你的问题确实是"will my memory be freed if appropriate?"那么答案是肯定的;引用计数将根据每个共享 ptr 对象的需要进行调整,如果它是 0,则该对象将被删除。
不,它会调用析构函数。析构函数将减少每个智能指针的引用计数,如果它带来 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
不会从堆中删除。
我最近更改了我的原始指针以在这样的容器中使用 std::shared_ptr
:
std::vector<std::shared_ptr<AbstractPathContainer>> mGeneratedPaths;
当我在此容器上调用 clear()
时,它会在其中的每个 std::shared_ptr
上调用 reset()
方法吗?
否;它将在每个指针上调用析构函数(可能调用也可能不调用 reset()
)。
如果你的问题确实是"will my memory be freed if appropriate?"那么答案是肯定的;引用计数将根据每个共享 ptr 对象的需要进行调整,如果它是 0,则该对象将被删除。
不,它会调用析构函数。析构函数将减少每个智能指针的引用计数,如果它带来 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
不会从堆中删除。