C++容器中的 STL 内存管理
C++ STL memory management in containers
我正在编写一些关键任务代码,我必须确保它绝对没有内存泄漏。我编写了一个小函数,允许我在运行时检索内存使用情况,并在执行一些代码(应该无泄漏(之前和之后进行测量,以查看内存使用情况是否保持在同一水平。
在调试一段"泄漏"的代码时,我终于发现罪魁祸首是向量容器。
重现我所看到的内容的最小代码如下:
vector<char*>* v = new vector<char*>();
int n = 1024*1024;
while (n--)
{
v->push_back(new char[256]()); // A
}
for (vector<char*>::iterator it=v->begin() ; it!=v->end() ; ++it )
{
delete[] (*it);
}
delete v;
如果你运行该代码(当然禁用编译器优化,-O0
(并在最后放置一些陷阱,以便程序不会退出(如cin.ignore();
(,你会看到你的程序应该使用大约20Mb左右的内存。
我想了解为什么会这样。我用A
标记了一行,如果您分配一个更大的字符数组,您会看到末尾的"剩余"内存也更大。我不会称这为泄漏本身,因为如果我分配并填充另一个 STL 容器,内存可以重用,但我仍然希望在代码完成后完全释放该内存。
有人可以阐明为什么仍在使用这种内存吗?我怎样才能真正"释放"它?
有关我的编译器环境的一些详细信息:
Using clang++: Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix
Compiling with: g++ -std=c++11 -g -Wall -Wextra -Wpedantic -O0 main.cc -o main.out
首先,没有理由在方案中动态分配容器。为什么?
其次,它是一个char*
容器,虽然它负责管理这些,但您对它们指向(或不指向(的任何内容保留全部和唯一的责任!
考虑使用 vector<char>
、unique_ptr<char>
、string
或类似的东西作为元素类型,让vector
承担该任务。
最后,请记住,运行时系统使用自己的基于操作系统原语构建的分配器,因此分配内存不会直接转换为对操作系统的请求,释放/删除它也不会立即将其返回到那里。
这样做效率低得令人难以置信。
如果你真的想确保释放的内存返回到操作系统,你基本上有两个选择(都涉及编写自己的分配器,或者查找和使用其他人构建的分配器(:
- 将可替换的全局分配和解除分配函数替换为您自己的函数。
- 仅对这些分配使用您自己的分配器(标准容器是分配器感知的,这意味着您可以基于每个容器提供自己的分配器(。
完成后,只需让您的分配器将所有内容释放回操作系统即可。
- 具有 STL 向量类型成员的类的复制内存
- 擦除是否删除 stl 无序列图元素使用的堆内存
- 具有 STL 类 c++ 的结构的内存分配
- 有没有办法从 STL 获取无开销的原始内存容器
- C++ STL 向量保留太多容量会消耗大量内存吗?
- 在函数中实例化的 STL 对象正在占用堆栈或堆上的内存?
- c ++ stl 库容器具有动态内存分配
- C++ 使用数组初始化时的 STL 向量内存管理
- 内存泄漏的 STL 替代方案
- 为什么 XOCDE STL 源内存类型定义有 |象征
- 如何根据STL列表中的元素数量分配内存
- 没有碎片stl容器的大容量内存
- 没有stl和动态内存分配的成员函数类
- 对于长时间运行的程序,STL 内存管理是否"reliable"?
- 带有内存比较的 STL 映射.如何在运行时设置比较块大小
- STL 矢量 push_back() 内存双倍可用
- 在插入C STL地图之前,我需要使用新的内存分配内存
- C++STL内存管理:堆栈或堆
- C++容器中的 STL 内存管理
- 如何强制清除 STL 内存缓存