内存释放std :: vector的boost :: shared_ptr

时间:2014-07-21 16:36:45

标签: c++ c++11 boost vector stl

我正在尝试使用以下代码释放boost::shared_ptr<std::vector<std::vector<std::vector<int> > > >的内存:

vec->clear();
std::vector<std::vector<std::vector<int> > > (*vec).swap(*vec);

但由于某种原因,它无法正常工作。我检查了 htop 命令,使用的内存与我从未发布过的内存相同。

然后我尝试分别释放每个向量,如:

for (auto it1 : *vec) 
{
    for (auto it2 : it1)
    {
        it2.clear();
        std::vector<int>(it2).swap(it2);
    }
    it1.clear();
    std::vector<int>(it1).swap(it1);
}   

但仍然消耗相同数量的内存。

我做错了吗?也许它与shared_ptr有关,因为我之前发布了没有指针的向量而且它有效。

更新

shared_ptr不会超出范围,因为它是一个在睡眠线程中保持执行的对象的类成员。

1 个答案:

答案 0 :(得分:1)

如果您有std::shared_ptr<std::vector>>,并且想删除它:

std::shared_ptr<std::vector<T>> ptr = ...;
ptr.reset();

如果您有std::vector<std::shared_ptr<T>>,并且想要清空它:

std::vector<std::shared_ptr<T>> vec = ...;
vec.clear();

如果您有std::vector<T>并且想要vec.capacity() == vec.size()

std::vector<T> vec = ...;
vec.shrink_to_fit(); // or: std::vector<T>(vec).swap(vec);

如果您担心 htop 没有向流程显示减少的已分配内存量,那么我们只需将此标记为此重复发布:vector<string> does not clear memory after out of scope