1

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

4

3 回答 3

1

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

于 2013-10-21T14:57:31.710 回答
1

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

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

一些分配器已经准备好使用(看看 boost::pool )

于 2013-10-21T15:25:40.637 回答
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)
    

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

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

int main()
{
   std::vector<int> v{0,1,2};
   delete &v[0];
} // (So, so wrong)
于 2013-10-21T15:14:48.163 回答