通过MSVC使用地址清理程序和_CrtDumpMemoryLeaks()

hfsqlsce  于 2023-02-15  发布在  其他
关注(0)|答案(1)|浏览(134)

我在使用/fsanitize=address/MDd编译器选项进行编译时遇到问题。

#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#else
#include <stdlib.h>
#endif

#include <stdio.h>

int main(int argc, char **argv) {
    _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
    _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
    _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
    _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);
    _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
    _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);

    int *foo = malloc(sizeof(*foo) * 1024);
    printf("%d\n", _CrtDumpMemoryLeaks());

    return EXIT_SUCCESS;
}

With cl test.c /MDd /Zi按预期工作并报告泄漏。

Detected memory leaks!
Dumping objects ->
test.c(20) : {104} normal block at 0x000001ABE8BFA130, 4096 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
1

但是,添加地址清理程序后,cl test.c /fsanitize=address /MDd /Zi报告没有泄漏。

0

我曾根据MSDN假设这可能有效。

hyrbngr7

hyrbngr71#

感谢评论者指出,即使他们一起工作,您也会认为_CrtDumpMemoryLeaks()总是会报告泄漏,因为:
AddressSanitizer运行时不会在执行期间将内存释放回操作系统。从操作系统的Angular 来看,这可能看起来像是内存泄漏。此设计决策是有意的,以免预先分配所有所需的内存。
我仍然不太确定我没有看到这种行为,虽然和_CrtDumpMemoryLeaks()是导致0时,/fsanitize=address被启用。
然而,这为我澄清了这个问题,我应该只期望创建不同的构建来测试地址消毒器或_CrtDumpMemoryLeaks()

相关问题