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
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