stdlib 的 free() 函数不适用于 stl 变量。有没有一种常用的方法来释放 stl 占用的空间(如向量、地图、集合等)?
3 回答
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::pool )
free
是 C 函数,不调用析构函数;因此,它在 C++ 中几乎总是错误的。delete
是 C++ 中的等价物。
不过,您应该在这里做什么取决于您所说的“STL 变量”是什么意思。如果您的意思是 C++ 标准库对象,那么您取消分配它们的方式与您在 C++ 中取消分配任何对象的方式相同:
如果您没有手动对对象进行内存管理,则什么也不做;
int main() { std::vector<int> v{0,1,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)
如果您通过
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_ptr
or std::shared_ptr
; 手动内存管理很糟糕!
您不应尝试手动对 C++ 标准库容器中的任何元素进行内存管理,因为容器拥有这些元素并且已经根据需要释放它们的内存:
int main()
{
std::vector<int> v{0,1,2};
delete &v[0];
} // (So, so wrong)