stdlib的free()函数对stl变量不起作用。 是否有一种通用的方法来释放stl所支持的空间(如矢量,地图,集等)?
答案 0 :(得分:1)
STL对象自动处理自己的解除分配。当STL对象超出范围时,运行析构函数,执行必要的解除分配。正如FrédéricHamidi指出的那样,如果在堆上进行分配,您应该自己解除对象的释放。在C ++中建议使用new / delete而不是C的malloc / free组合。
答案 1 :(得分:1)
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
或std::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)