Compartilhar via


Erro: alloc-dealloc-mismatch

Erro do sanitizador de endereço: incompatibilidade entre APIs de alocação e desalocação

Observações

Permite a detecção em runtime de operações de memória incompatíveis que podem levar a um comportamento indefinido, como:

  • malloc deve ser emparelhado com free, não delete ou delete[].
  • new deve ser emparelhado com delete, não free ou delete[].
  • new[] deve ser emparelhado com delete[], não delete ou free.

No Windows, alloc-dealloc-mismatch a detecção de erros está desativada por padrão. Para habilitá-la, defina a variável set ASAN_OPTIONS=alloc_dealloc_mismatch=1 de ambiente antes de executar seu programa.

Exemplo

// 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;
}

Em um prompt de comando do desenvolvedor do Visual Studio 2019 versão 16.9 ou posterior, execute os seguintes comandos para ver um exemplo de:alloc_dealloc_mismatch

cl example1.cpp /fsanitize=address /Zi
set ASAN_OPTIONS=alloc_dealloc_mismatch=1
devenv /debugexe example1.exe 2

Saída

Captura de tela do depurador exibindo o erro alloc-dealloc-mismatch no exemplo 1.

Confira também

Visão geral do AddressSanitizer
Problemas conhecidos do AddressSanitizer
Referência de linguagem e build do AddressSanitizer
Referência de runtime do AddressSanitizer
Bytes de sombra de AddressSanitizer
Nuvem do AddressSanitizer ou teste distribuído
Integração do depurador do AddressSanitizer
Exemplos de erro do AddressSanitizer