大型动态阵列的怪异内存泄漏

Weird Memory Leak with large dynamic array

本文关键字:内存 泄漏 动态 阵列 大型      更新时间:2023-10-16

我有以下代码

int main()
{
    int* myDynamicArray;
    myDynamicArray = new int[20000000];
    int numIte;
    cout << "number of iterations" << endl;
    cin >> numIte;
    for (int i = 0; i < numIte; ++i)
        foo(myDynamicArray);
    delete [] myDynamicArray;
    return 0;
 }

我不明白的是,当输入的迭代次数很大时,系统使用的内存会随着循环次数的增加而增加。这正常吗?

由于foo没有显示,而且它可能在没有传入数组索引的情况下调用它是没有意义的,所以我来猜测一下。换句话说,我猜测真正的foo接受某种数组索引或长度作为参数,并基于该索引访问myDynamicArray的元素。

如果这是真的(这不是foo泄漏内存的简单情况),那么您可能要测量的是实际提交的内存量。分配的内存是80MB,但在访问数组之前可能不会提交内存。因此,foo访问的数组越多,可能会导致提交更多的内存。

如果没有foo的完整定义,这个问题是不可能回答的。然而,这里有一些想法。。。

最好将myDynamicArray封装在某种形式的安全指针中,可能是std::auto_ptr,或者在foo可能保留对指针std::tr1::shared_ptr的引用的情况下。

除非对foo构造函数/函数的调用导致分配额外的内存,否则没有理由认为增加循环迭代次数会以任何方式影响程序运行时内存的使用。

最后,如何监控程序的运行时内存使用情况?在Windows任务管理器(或等效工具)中查看数字并不是一个特别稳健的解决方案,您可以尝试自己手动跟踪所有内存分配(通过覆盖new/malloc),以真正了解何时、何地以及在堆上分配了多少内存。