Freigeben über


Fehler: alloc-dealloc-mismatch

Bereinigungsfehler: Konflikt zwischen Zuordnung und Deallocation-APIs

Bemerkungen

Ermöglicht die Laufzeiterkennung von nicht übereinstimmenden Speichervorgängen, die zu einem nicht definierten Verhalten führen können, z. B.:

  • malloc muss mit free, nicht delete oder delete[].
  • new muss mit delete, nicht free oder delete[].
  • new[] muss mit delete[], nicht delete oder free.

In Windows alloc-dealloc-mismatch ist die Fehlererkennung standardmäßig deaktiviert. Um sie zu aktivieren, legen Sie die Umgebungsvariable set ASAN_OPTIONS=alloc_dealloc_mismatch=1 vor dem Ausführen des Programms fest.

Beispiel

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

Führen Sie in einer Visual Studio 2019- Version 16.9- oder höher-Entwickler-Eingabeaufforderung die folgenden Befehle aus, um ein Beispiel zu alloc_dealloc_mismatchsehen:

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

Ausgabe

Screenshot des Debuggers, der den Fehler

Siehe auch

AddressSanitizer -Übersicht
Beheben bekannter Probleme mit demSanitizer
AddressSanitizer Build- und Sprachreferenz
AddressSanitizer-Laufzeitreferenz
AddressSanitizer-Schattenbytes
AddressSanitizer-Cloud oder verteilte Tests
AddressSanitizer Debugger-Integration
Beispiele für AddressSanitizer-Fehler