Freigeben über


C6280

Warnung C6280: <Variable> wird mit <Funktion> zugeordnet, aber mit <Funktion> gelöscht.

Diese Warnung gibt an, dass die aufrufende Funktion Speicher inkonsistent belegt hat, indem eine Funktion aus einer Familie der Speicherbelegungen verwendete und sie freigegeben hat, indem Sie eine Funktion aus einer anderen Familie der Speicherbelegungen verwendet.Die Analyzerüberprüfungen für dieses an, wenn die _Analysis_mode_(_Analysis_local_leak_checks_) SAL-Anmerkungen angegeben wird.Standardmäßig wird diese Anmerkung für Code Windows-Kernelmodus (Treiber) angegeben.Weitere Informationen zu SAL-Anmerkungen, finden Sie unter Verwenden von SAL-Anmerkungen zum Reduzieren von C/C++-Codefehlern.

Beispielsweise wird diese Warnung erzeugt, wenn Speicher belegt wird, freigegeben, indem malloc jedoch verwendet, indem GlobalFree oder delete verwendet.In den bestimmten Fällen von Konflikten zwischen Array new[] und skalares delete, werden genauere Warnungen anstelle dieser gemeldet.

Beispiel

Im folgenden Beispielcode wird diese Warnung generiert.

// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
 
_Analysis_mode_(_Analysis_local_leak_checks_)
 
void f(int arraySize)
{
    int *pInt = (int *)calloc(arraySize, sizeof (int));
    // code ...
    delete pInt;
}

Um diese Warnung zu korrigieren, verwenden Sie den folgenden Code:

// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
 
_Analysis_mode_(_Analysis_local_leak_checks_)
 
void f(int arraySize)
{
    int *pInt = (int *)calloc(arraySize, sizeof (int));
    // code ...
    free(pInt);
}

Andere API-Definitionen können andere Heaps verwenden,Beispielsweise verwendet GlobalAlloc den Systemheap und free Verwendung der Prozessheap.Dies ist wahrscheinlich, Speicherbeschädigungen und Abstürze verursachen.

Diese Inkonsistenzen gelten für new/delete und malloc/free Speicherbelegungsmechanismen zu.Um diese Arten möglicher Inkonsistenzen vollständig zu vermeiden, verwenden Sie die Mechanismen die von der C++-Standardvorlagenbibliothek (STL) bereitgestellt werden.Diese schließen shared_ptr, unique_ptr und vector ein.Weitere Informationen finden Sie unter Intelligente Zeiger modernes (C++) und Standard C++ Library Reference.

// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <vector>
#include <memory>
 
using namespace std;
 
_Analysis_mode_(_Analysis_local_leak_checks_)

void f(int arraySize)
{
    // use unique_ptr instead of calloc/malloc/new
    unique_ptr<int[]> pInt(new int[arraySize]);
    
    // code ...
 
    // No need for free because unique_ptr 
    // cleans up when out of scope.
}

Siehe auch

Referenz

calloc

malloc

Frei

operator new (<new>)

delete-Operator (C++)

shared_ptr

unique_ptr

Konzepte

Intelligente Zeiger modernes (C++)