释放stl占用的空间

时间:2013-10-21 14:55:04

标签: c++ stl

stdlib的free()函数对stl变量不起作用。 是否有一种通用的方法来释放stl所支持的空间(如矢量,地图,集等)?

3 个答案:

答案 0 :(得分:1)

STL对象自动处理自己的解除分配。当STL对象超出范围时,运行析构函数,执行必要的解除分配。正如FrédéricHamidi指出的那样,如果在堆上进行分配,您应该自己解除对象的释放。在C ++中建议使用new / delete而不是C的malloc / free组合。

答案 1 :(得分:1)

free是一个C函数,不会调用析构函数;因此,在C ++中几乎总是错误的。 delete在C ++中是等效的。

但是,你应该在这里做什么取决于“STL变量”的含义。如果您指的是C ++标准库对象,那么您可以像在C ++中取消分配任何对象一样取消分配它们:

  1. 如果您没有手动记忆管理对象,什么都不做;

    int main()
    {
        std::vector<int> v{0,1,2};
    }
    
  2. 如果您通过new创建对象来手动对内容进行内存管理,则可以使用delete;

    int main()
    {
        std::vector<int>* ptr = new std::vector<int>();
        ptr->push_back(0);
        ptr->push_back(1);
        ptr->push_back(2);
        delete(ptr);
    } // (PLEASE don't do this)
    
  3. 如果您通过在数组中使用new[]创建对象来手动对内容进行内存管理,请使用delete[]

    int main()
    {
        std::vector<int>* ptr = new std::vector<int>[1];
        ptr[0].push_back(0);
        ptr[0].push_back(1);
        ptr[0].push_back(2);
        delete[](ptr);
    } // (PLEASE don't do this either)
    
  4. 但是,在情况2和3中,您应该实际使用智能指针,例如std::unique_ptrstd::shared_ptr;手动内存管理

    您不应尝试手动内存管理C ++标准库容器中的任何元素,因为容器拥有这些容器并且已根据需要释放其内存:

    int main()
    {
       std::vector<int> v{0,1,2};
       delete &v[0];
    } // (So, so wrong)
    

答案 2 :(得分:1)

您可以滚动自己的分配器,以自己的方式管理容器内的对象。

http://www.codeproject.com/Articles/4795/C-Standard-Allocator-An-Introduction-and-Implement

一些分配器已经可以使用了(看看boost :: pool)