Freigeben über


Warnung C6280

'Variable-name' wird mit 'function-name-1' zugewiesen, aber mit 'function-name-2' gelöscht.

Diese Warnung weist darauf hin, dass die aufrufende Funktion inkonsistent Arbeitsspeicher zugewiesen hat, indem eine Funktion aus einer Familie verwendet und mithilfe einer Funktion von einer anderen freigegeben wird.

Hinweise

Der Analyzer überprüft auf diese Bedingung, wenn die _Analysis_mode_(_Analysis_local_leak_checks_)-SAL-Anmerkung angegeben wird. Standardmäßig ist diese Anmerkung für den Windows-Kernelmoduscode (Treiber) angegeben. Weitere Informationen zu SAL-Anmerkungen finden Sie unter Verwenden von SAL-Anmerkungen zur Reduzierung von C/C++-Codefehlern.

So wird diese Warnung z. B. ausgegeben, wenn Speicher mit malloc belegt, aber mit GlobalFree oder delete freigegeben wird. In den bestimmten Fällen, in denen Konflikte zwischen new[]-Array- und delete-Skalaroperationen auftreten, werden statt dieser Warnung genauere Warnungen ausgegeben.

Codeanalysename: MEMORY_ALLOCATION_MISMATCH

Beispiel

Im folgenden Beispielcode wird diese Warnung generiert. pInt wird mithilfe der calloc nicht übereinstimmende Funktion deletezugewiesen, wird jedoch freigegeben:

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

Der folgende Code vermeidet diese Warnung mithilfe der Deallocation-Funktion free, der Übereinstimmung mit calloc:

// C6280a_no_warning.cpp
// 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 verwendet den Prozessheap. Dieses Problem verursacht wahrscheinlich Speicherbeschädigungen und Abstürze.

Diese Inkonsistenzen gelten für die Mechanismen für die new/delete Speicherzuweisung.malloc/free Verwenden Sie die Mechanismen, die von der C++-Standardbibliothek (STL) bereitgestellt werden, um mögliche Inkonsistenzen zu vermeiden. Dazu gehören shared_ptr, , unique_ptrund Container wie vector. Weitere Informationen finden Sie unter Intelligente Zeiger und C++-Standardbibliothek.

Der folgende Code vermeidet dieses Problem vollständig mithilfe unique_ptrvon :

// C6280b_no_warning.cpp
// 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

calloc
malloc
free
operator new
delete-Operator
shared_ptr
unique_ptr
Intelligente Zeiger