我发现有关运行以下(示例)代码的内存管理的意外结果:
#include <stdint.h>
#include <iostream>
#include <vector>
#define BIGNUM 100000000
// sample struct
struct Coordinate {
uint64_t x;
uint64_t y;
uint64_t z;
Coordinate() {
x = 1ULL;
y = 2ULL;
z = 3ULL;
}
};
int main() {
std::vector<Coordinate*>* coordinates = new std::vector<Coordinate*>();
for (int i = 0; i < BIGNUM; ++i)
coordinates->push_back(new Coordinate());
// block 1
for(std::vector<Coordinate*>::iterator it = coordinates->begin(); it != coordinates->end(); ++it)
delete(*it);
// block 2
delete(coordinates);
std::cout << "end\n";
std::cin.get();
return 0;
}
在我的Ubuntu 14.04上:
命令 ps aux --sort -rss 在std::cin.get();
上执行了4次,差异很小:
1)程序原样
2)对块1进行了评论(基本上没有删除每个向量的元素)
3)用块2注释(因此在向量上没有删除)
4)块1和2都被评论。
我的(大)惊喜测试1)和2)具有几乎相同的 RSS / VSZ 结果。简单来说,似乎delete(*it);
没有正常工作(没有释放内存)。使用3)和4)可以获得相同的结论。
在Windows XP上(在VirtualBox中运行)一切正常,内存为0-2 MB,按原样运行程序。
答案 0 :(得分:3)
仅仅因为delete
释放内存并不意味着内存会立即释放回操作系统以供一般使用。现代操作系统的内存管理是just not that simple。
除了你的假设之外,这里没有任何错误!