Dela via


Fel: alloc-dealloc-mismatch

Adressfel för sanitizer: Matchningsfel mellan allokerings- och frigörings-API:er

Anmärkningar

Aktiverar körningsidentifiering av felmatchade minnesåtgärder som kan leda till odefinierat beteende, till exempel:

  • malloc måste parkopplas med free, inte delete eller delete[].
  • new måste parkopplas med delete, inte free eller delete[].
  • new[] måste parkopplas med delete[], inte delete eller free.

I Windows alloc-dealloc-mismatch är felidentifieringen inaktiverad som standard. Om du vill aktivera den anger du miljövariabeln set ASAN_OPTIONS=alloc_dealloc_mismatch=1 innan du kör programmet.

Exempel

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

I en kommandotolk för Visual Studio 2019 version 16.9 eller senare kör du följande kommandon för att se ett exempel på alloc_dealloc_mismatch:

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

Utgång

Skärmbild av felsökningsprogrammet som visar felet alloc-dealloc-mismatch i exempel 1.

Se även

AddressSanitizer– översikt
AddressSanitizer kända problem
AddressSanitizer- och språkreferens
AddressSanitizer-körningsreferens
AddressSanitizer skugg byte
AddressSanitizer-moln eller distribuerad testning
AddressSanitizer-felsökningsintegrering
AddressSanitizer-felexempel