删除和内存管理

时间:2015-08-09 14:40:57

标签: c++ memory memory-management

我发现有关运行以下(示例)代码的内存管理的意外结果:

#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上:

enter image description here

命令 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,按原样运行程序。

1 个答案:

答案 0 :(得分:3)

仅仅因为delete释放内存并不意味着内存会立即释放回操作系统以供一般使用。现代操作系统的内存管理是just not that simple

除了你的假设之外,这里没有任何错误!