【发布时间】:2015-11-01 12:44:36
【问题描述】:
我发现关于运行以下(示例)代码的内存管理的意外结果:
#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。
【问题讨论】:
-
你为什么首先在这里使用
newdelete?? -
@πάνταῥεῖ 我在一个更复杂的程序中发现了这个问题。这里只是一个简化的例子!
-
您的 simplified 示例可能过于简化,因为它不会重现所描述的行为。
-
我不明白你的意思。我只是说
delete(*it);似乎无法正常工作,因为 ps 在删除被评论时返回相同的 VSZ/RSS 而不是 -
@c.bear:4GB 内存,Windows 7,标准交换设置 (3562 MB)。我猜这个笔记本对于新一代软件来说已经慢慢变老了...... :)
标签: c++ memory memory-management