在Visual C ++中检查内存泄漏的正确方法

时间:2015-12-01 03:11:47

标签: c++ c arraylist memory-leaks

我最近一直试图提高自己的个人C ++技能,所以我实施了一个数组列表作为学习练习。在我开始工作之后,我开始检查内存泄漏,并且对输出感到非常困惑。

Source on GitHub (main.cpp, ArrayList.cpp, ArrayList.h)

我从this page from Microsoft获得了很多关于如何开始检查泄漏的信息(因此主文件顶部的声明,main函数的开头和ArrayList.cpp文件的顶部

Visual Studio告诉我这个信息:

void AL::ShrinkToFit()
{
    int* newArray = new int[currentIndexOfFirstOpen]; //Line 48, as mentioned in the mem leak output
    for (int i = 0; i < currentIndexOfFirstOpen; i++)
    {
        newArray[i] = currentArray[i];
    }
    int* oldArray = currentArray;
    currentArray = newArray;
    delete[] oldArray;
    currentMaxLoad = currentIndexOfFirstOpen;
}

有问题的代码部分

>>> my_lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> my_lst_str = ''.join(map(str, my_lst))
>>> print(my_lst_str)
'12345678910'

很明显我错过了一些东西。如果你检查上面链接的ArrayList.cpp文件,它(在不同的情况下)告诉我,我在该文件中的任何地方都有泄漏&#34; new int [some number]&#34;。来自Microsoft的页面说我必须使用预处理器来重新定义new,因为它只适用于C运行时,但它没有提到delete(或delete [])。这个记忆真的被泄露了吗?我有一个匹配的删除[]为每个新的[],但我不能告诉它是否是合法的泄漏或泄漏检测工具是否不理解删除。我尝试用免费替换删除(我让预处理器重新定义了新文章中的新内容),它没有做任何改动。如果我漏水,有人可以指出在哪里/为什么?

1 个答案:

答案 0 :(得分:0)

我尝试使用Visual Leak Detector(https://vld.codeplex.com/)运行您的代码,看起来您没有内存泄漏,但退出时(使用关闭按钮)命令提示符泄漏检测器失败并检测到你提到的那条线路漏水了。尝试在main.cpp中删除此行

Sleep(1000000); //hold the prompt open

并将其改为

std::cin.get();
return 0;

在程序结束时提供按键并使用代码0退出操作系统,这可以解决您的问题。