解除分配 stl 占用的空间
Deallocating space occupied by stl
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++中的任何对象相同:
-
如果未手动对对象进行内存管理,则不执行任何操作;
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)
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 在C应用程序中运行C++(带有STL)函数
- 使用2个键的cpp-stl::优先级队列排序不正确
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- STL算法和back_inserter可以预分配空间吗?
- fstream.h 中的 STL 命名空间错误与 qmake/make.
- 如何使一种类型的STL对只占用另一种类型的空间"empty struct"?
- 解除分配 stl 占用的空间
- STL 中的自由函数是否需要命名空间
- 与 MinGW STL 的 Clang (错误:全局命名空间中没有名为 'fgetws' 的成员)
- 为什么这个列表实现比 stl 列表占用更多的空间
- 名称空间和使用stl算法的用户定义操作符