通过


错误:alloc-dealloc-mismatch

地址擦除系统错误:分配 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

输出

显示示例 1 中 alloc-dealloc-mismatch 错误的调试器的屏幕截图。

另请参阅

AddressSanitizer 概述
AddressSanitizer 已知问题
AddressSanitizer 生成和语言参考
AddressSanitizer 运行时参考
AddressSanitizer 阴影字节
AddressSanitizer 云或分布式测试
AddressSanitizer 调试程序集成
AddressSanitizer 错误示例