Delen via


Fout: alloc-dealloc-mismatch

Adres opschoningsfout: niet overeenkomen tussen toewijzings- en deallocatie-API's

Opmerkingen

Maakt runtimedetectie mogelijk van niet-overeenkomende geheugenbewerkingen die kunnen leiden tot niet-gedefinieerd gedrag, zoals:

  • malloc moet zijn gekoppeld aan free, niet delete of delete[].
  • new moet zijn gekoppeld aan delete, niet free of delete[].
  • new[] moet zijn gekoppeld aan delete[], niet delete of free.

In Windows alloc-dealloc-mismatch is foutdetectie standaard uitgeschakeld. Als u deze wilt inschakelen, stelt u de omgevingsvariabele set ASAN_OPTIONS=alloc_dealloc_mismatch=1 in voordat u het programma uitvoert.

Voorbeeld

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

Voer in een opdrachtprompt voor ontwikkelaars van Visual Studio 2019 versie 16.9 of hoger de volgende opdrachten uit om een voorbeeld van alloc_dealloc_mismatch:

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

Uitvoer

Schermopname van het foutopsporingsprogramma met de fout alloc-dealloc-mismatch in voorbeeld 1.

Zie ook

Overzicht van AddressSanitizer
AddressSanitizer bekende problemen
AddressSanitizer-build- en taalreferenties
naslaginformatie over AddressSanitizer-runtime
addressSanitizer schaduwbytes
AddressSanitizer-cloud of gedistribueerde tests
integratie van AddressSanitizer-foutopsporingsprogramma's
voorbeelden van AddressSanitizer-fouten