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