我想使用 Visual Studio 22 检测简单的内存泄漏。我使用的是 C++。
#include <iostream>
void leak(const unsigned numBytesToLeak)
{
new char[numBytesToLeak];
}
int main()
{
std::cout << "before" << std::endl; // breakpoint 1
leak(646497);
std::cout << "after" << std::endl; // breakpoint 2
}
我正在使用
Debug
构建,并将优化设置为 /Od
(关闭)。
我在导致泄漏的行周围设置了两个断点。我正在运行调试器并在泄漏之前和之后拍摄堆快照。我认为我应该看到的是当我到达第二个断点时堆的增加。但我不这么认为。
为什么我的内存泄漏没有被检测到?
用
/std:c++20 /W4 /O2
编译程序时查看程序集,发现程序确实会泄漏,所以泄漏并没有被优化掉:
numBytesToLeak$ = 8
void leak(unsigned int) PROC ; leak, COMDAT
mov ecx, ecx
jmp void * operator new[](unsigned __int64) ; operator new[]
void leak(unsigned int) ENDP ; leak
main PROC ; COMDAT
$LN6:
sub rsp, 40 ; 00000028H
mov ecx, 646497 ; 0009dd61H
call void * operator new[](unsigned __int64) ; operator new[]
xor eax, eax
add rsp, 40 ; 00000028H
ret 0
main ENDP
/fsanitize=address
进行编译(如果编译未优化,它会捕获 g++ 和 clang++ 中的泄漏),它也会报告泄漏。
您很可能必须等到足够多的人请求将
/fsanitize=leak
也添加到 Visual Studio 中,才能发现此类泄漏。