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