在Windows上开发的程序中的内存泄漏检测

时间:2011-02-01 03:19:13

标签: c winapi

我在视觉工作室工作,用C开发一个程序。有没有办法在Visual Studio中检测我的程序的内存泄漏?或者一般来说,Windows开发人员的任何内存泄漏检测库(类似于linux的valgrind)....请告诉我。感谢。

5 个答案:

答案 0 :(得分:2)

你可以#include <crtdbg.h>

在程序开始时输入以下代码:

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEMDF | _CRT_LEAK_CHECK_DF);

或在程序结束之前返回退出代码:

_CrtDumpMemoryLeaks();

第一种方式是更好的imo,因为它会在程序退出时自动显示内存泄漏,而且只有一行代码。如果您使用_CrtDumpMemoryLeaks(),则必须将其放置在程序可能退出的任何位置。

程序退出时,输出窗口中将显示任何内存泄漏。这只适用于视觉工作室。

我认为这不会显示分配发生位置的文件和行号。在C ++中,您可以重新定义new关键字以显示分配的位置:

#ifdef _DEBUG
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif

答案 1 :(得分:1)

我使用Visual Leak Detector。它是免费且非常有效的,您只需在程序中包含头文件<vld.h>即可。
它给出了已分配但未释放的内存的完整堆栈跟踪。

答案 2 :(得分:0)

我不是专家程序员,但我使用Intel并行工作室来检查内存泄漏。它非常不可思议,无缝集成到visual studio中,并提供极其简单的控件来检测程序中的各种错误。几乎只需安装并运行它就可以开始查找内存错误。

虽然有30天的试用期,但唯一的问题是价格标签。

答案 3 :(得分:0)

对于Visual Studio中的工作已经开发了可靠的插件。至于我,我喜欢删除者,它很容易使用。

答案 4 :(得分:0)

我知道这个话题很老,但是我通过使用自己的函数改进实际的malloc和free函数,从而实现了检测内存泄漏的目的。可悲的是,您需要使用这些功能分配和释放内存,并且该解决方案仅适用于Windows。

如果您对此感兴趣,只需将其包含在代码中或为此添加标题即可。

#include <malloc.h>

typedef struct{
    BOOL detection;
    LONG allocs;
    LONG frees;
    LONG memoryUsed;
    LONG memoryReleased;
    LONG memoryActual;
} MEMORY_WATCH;
MEMORY_WATCH MEMORY = {FALSE, 0, 0, 0, 0, 0};
/**
 * Controlled Memory Allocations.
 * 
 * @param size Size of the requested memory.
 * @return A pointer to requested memory.
 */
void *CMalloc(size_t size){
    void *memblock = malloc(size);
    if(MEMORY.detection && memblock != NULL){
        MEMORY.allocs++;
        MEMORY.memoryUsed += size;
        MEMORY.memoryActual += size;
    }
    return memblock;
}
/**
 * Controlled Memory Release.
 * 
 * @param memblock A pointer to memory that is going to be released.
 */
void CFree(void *memblock){
    if(MEMORY.detection && memblock != NULL){
        MEMORY.frees++;
        MEMORY.memoryReleased += _msize(memblock);
        MEMORY.memoryActual -= _msize(memblock);
    }
    free(memblock);
}

在Main程序的开头键入MEMORY.detection = TRUE,然后在main的末尾输入以下内容:

printf("\n\nMemory result:\n");
printf("\t%ld calls\tAllocated\n\t%ld calls\tFreed\n\n", MEMORY.allocs, MEMORY.frees);
printf("\t%ld bytes\tUsed\n\t%ld bytes\tReleased\n\n", MEMORY.memoryUsed, MEMORY.memoryReleased);
printf("\t%ld bytes\tMissing\n", MEMORY.memoryActual);

我将此解决方案应用到了程序中,发现一个泄漏占用了我7个字节。只是忘了释放一个内存块。

Number of Values: 7
        Value(4): Path
                (132):  REG_EXPAND_SZ
                "C:\ProgramFiles\Windows\System Overflow.exe" "-i -x -v file.txt"
        Value(9): Languages
                (6):    REG_MULTI_SZ
                (6): EN
                (6): SK
                (6): CZ
                (8): GER
                (6): JP
                (6): RU
        Value(16): SelectedLanguage
                (6):    REG_SZ
                EN
        Value(11): KeyModifier
                (6):    REG_BINARY
                0 16 17 33 99 113
        Value(9): SpecialID
                (4):    REG_DWORD
                22689
        Value(8): UniqueID
                (8):    REG_QWORD
                110022689
        Value(9): Standards
                (5):    REG_MULTI_SZ
                (14): ISO600
                (16): ISO9236
                (18): ISO9236a
                (18): ISO9236b
                (14): ISO512


Memory result:
        34 calls        Allocated
        33 calls        Freed

        374 bytes       Used
        367 bytes       Released

        7 bytes Missing

RUN SUCCESSFUL (total time: 22ms)