Aracılığıyla paylaş


Hata: alloc-dealloc-mismatch

Adres Temizleme Hatası: Ayırma ve serbest bırakma API'leri arasındaki uyuşmazlık

alloc/dealloc AddressSanitizer'daki uyumsuzluk işlevi Windows için varsayılan olarak kapalıdır. Etkinleştirmek için programı çalıştırmadan önce komutunu çalıştırın set ASAN_OPTIONS=alloc_dealloc_mismatch=1 . Bu ortam değişkeni, , newfree/vedelete[]/new üzerindeki malloc/deletehataları bildirmek için çalışma zamanında denetlendi.

Örnek

// example1.cpp
// 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;
}

Bu örneği derlemek ve test etmek için visual studio 2019 sürüm 16.9 veya sonraki bir geliştirici komut isteminde şu komutları çalıştırın:

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

Sonuçta oluşan hata

Screenshot of debugger displaying alloc-dealloc-mismatch error in example 1.

Ayrıca bkz.

AddressSanitizer'a genel bakış
AddressSanitizer bilinen sorunları
AddressSanitizer derlemesi ve dil başvurusu
AddressSanitizer çalışma zamanı başvurusu
AddressSanitizer gölge baytları
AddressSanitizer bulut veya dağıtılmış test
AddressSanitizer hata ayıklayıcısı tümleştirmesi
AddressSanitizer hata örnekleri