【问题标题】:delete and memory management删除和内存管理
【发布时间】: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 -rssstd::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。

【问题讨论】:

  • 你为什么首先在这里使用new delete??
  • @πάνταῥεῖ 我在一个更复杂的程序中发现了这个问题。这里只是一个简化的例子!
  • 您的 simplified 示例可能过于简化,因为它不会重现所描述的行为。
  • 我不明白你的意思。我只是说delete(*it); 似乎无法正常工作,因为 ps 在删除被评论时返回相同的 VSZ/RSS 而不是
  • @c.bear:4GB 内存,Windows 7,标准交换设置 (3562 MB)。我猜这个笔记本对于新一代软件来说已经慢慢变老了...... :)

标签: c++ memory memory-management


【解决方案1】:

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

除了你的假设,这里没有错!

【讨论】:

  • 我也是这么想的。但我真的必须在我的真实场景中释放内存,因为我正在开发一个非常巨大的内存消耗程序(16GB 很快就被吃掉了)。是否有任何编译器选项或可以帮助我的东西?
  • @c.bear:不,你没有。您的操作系统足够智能,可以自行解决。让它完成它的工作,不要在您从ps 看到的这些数字中投入太多库存。考虑购买一本关于操作系统和虚拟内存方案的书。
猜你喜欢
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 2013-07-26
  • 2016-10-12
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 2021-01-23
相关资源
最近更新 更多