解除分配 stl 占用的空间

Deallocating space occupied by stl

本文关键字:空间 stl 解除分配      更新时间:2023-10-16

stdlib 的 free() 函数不适用于 stl 变量。有没有一种常见的方法来释放 stl 占用的空间(如向量、映射、集合等)?

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

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

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

一些分配器已准备就绪(请查看boost::p ool)

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)
    

但是,在情况 2 和 3 中,您实际上应该使用智能指针,例如 std::unique_ptrstd::shared_ptr ;手动内存管理是不好的

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

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