Compartilhar via


Erro: new-delete-type-mismatch

Erro na limpeza de endereço: tamanho de desalocação diferente do tamanho da alocação

Neste exemplo, apenas ~Base, e não ~Derived, é chamado. O compilador gera uma chamada a ~Base(), pois o destruidor Base não é virtual. Quando chamamos delete b, o destruidor do objeto está associado à definição padrão. O código exclui uma classe base vazia (ou 1 byte no Windows). Uma palavra-chave virtual ausente na declaração de destruidor é um erro comum do C++ ao usar a herança.

Exemplo – destruidor virtual

// example1.cpp
// new-delete-type-mismatch error
#include <memory>
#include <vector>

struct T {
    T() : v(100) {}
    std::vector<int> v;
};

struct Base {};

struct Derived : public Base {
    T t;
};

int main() {
    Base *b = new Derived;

    delete b;  // Boom! 

    std::unique_ptr<Base> b1 = std::make_unique<Derived>();

    return 0;
}

As classes base polimórficas devem declarar destruidores virtual. Se uma classe tiver funções virtuais, ela deverá ter um destruidor virtual.

Para corrigir o exemplo, adicione:

struct Base {
  virtual ~Base() = default;
}

Para compilar e testar esse exemplo, execute estes comandos em um prompt de comando do desenvolvedor do Visual Studio 2019 versão 16.9 ou posterior:

cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe

Erro resultante

Captura de tela do depurador exibindo o erro new-delete-type-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