错误:
地址擦除系统错误:分配 API 与解除分配 API 之间不匹配
注解
启用运行时检测可能导致未定义行为的不匹配内存作,例如:
-
malloc必须与或否freedelete配对delete[]。 -
new必须与或否deletefree配对delete[]。 -
new[]必须与或否delete[]delete配对free。
在 Windows 中, alloc-dealloc-mismatch 错误检测默认处于关闭状态。 若要启用它,请在运行程序之前设置环境变量 set ASAN_OPTIONS=alloc_dealloc_mismatch=1 。
示例
// example1.cpp
// Demonstrate alloc-dealloc-mismatch error
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
if (argc != 2) return -1;
switch (atoi(argv[1]))
{
case 1:
delete[](new int[10]);
break;
case 2:
delete (new int[10]); // Boom!
break;
default:
printf("arguments: 1: no error 2: runtime error\n");
return -1;
}
return 0;
}
在 Visual Studio 2019 版本 16.9 或更高版本 的开发人员命令提示符中,运行以下命令以查看示例 alloc_dealloc_mismatch:
cl example1.cpp /fsanitize=address /Zi
set ASAN_OPTIONS=alloc_dealloc_mismatch=1
devenv /debugexe example1.exe 2
输出
另请参阅
AddressSanitizer 概述
AddressSanitizer 已知问题
AddressSanitizer 生成和语言参考
AddressSanitizer 运行时参考
AddressSanitizer 阴影字节
AddressSanitizer 云或分布式测试
AddressSanitizer 调试程序集成
AddressSanitizer 错误示例