Visual Studio 22 - Diagnostic Tools - 内存使用情况未显示内存泄漏

4
我想使用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
}

我正在使用带有优化设置为/Od(关闭)的Debug构建。
我在导致内存泄漏的那行代码周围设置了两个断点。我正在运行调试器,并在泄漏之前和之后对堆进行快照。根据我的理解,当我触发第二个断点时,应该看到堆的增加。但实际上并没有。

Screenshot of Visual Studio. Shows my source code and Diagnostics Tools window. The Memory Usage view in the Diagnostics window shows that my heap size did not increase despite the code allocating memory on the heap using the keyword new.


为什么我的内存泄漏没有被检测到?

在初始化之前,内存可能没有被物理分配。 - 273K
1
或者“新”可能已经完全被消除,因为指针没有被引用。 - 500 - Internal Server Error
@273K 但是构建调试模式不应该使它执行我所编写的内容吗? - Vader
这真是太奇怪了;我尝试在MFC中使用"_CRTDBG_MAP_ALLOC",但它也没有报告任何问题! - o_oTurtle
new最终会调用一个库函数,而编译器并不决定是否分配真实的内存空间。 - 273K
1个回答

2
编译程序时,使用/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

然而,VS2022并没有将此视为问题。即使使用/fsanitize=address(在g++和clang++编译未经优化的情况下捕获泄漏)编译,也不会报告泄漏。

你可能需要等待足够多的人要求将/fsanitize=leak添加到Visual Studio中,才能捕获此类泄漏。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接