Visual Studio 22 - 诊断工具 - 内存使用情况未显示内存泄漏

问题描述 投票:0回答:1

我想使用 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
(关闭)。


我在导致泄漏的行周围设置了两个断点。我正在运行调试器并在泄漏之前和之后拍摄堆快照。我认为我应该看到的是当我到达第二个断点时堆的增加。但我不这么认为。


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

c++ visual-studio memory-leaks heap-memory visual-studio-2022
1个回答
0
投票

/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 中,才能发现此类泄漏。

© www.soinside.com 2019 - 2024. All rights reserved.