Udostępnij za pośrednictwem


C6280

ostrzeżenie C6280: <variable> jest przydzielona za pomocą <function>, ale usunięta za pomocą <function>

To ostrzeżenie wskazuje, że wywoływania funkcji ma niespójnie przydzielonej pamięci przy użyciu funkcji z rodziny alokacji pamięci jeden i zwalniane go za pomocą funkcji z inną rodziną alokacji pamięci.Analizator sprawdza ten dodatkowy warunek tylko wtedy, gdy _Analysis_mode_(_Analysis_local_leak_checks_) SAL adnotacji jest określona.Domyślnie ta adnotacja określono kod (sterownik) trybu jądra systemu Windows.Aby uzyskać więcej informacji na temat adnotacji SAL, zobacz Za pomocą adnotacji SAL do zmniejszenia wady kod C/C++.

Na przykład, może zostać wytworzony to ostrzeżenie, jeśli pamięć została przydzielona przy użyciu malloc ale zwolnionej za pomocą GlobalFree lub delete.W szczególnych przypadkach niezgodności między tablicy new[] i skalarnych delete, zamiast tego zgłaszane są bardziej precyzyjne ostrzeżenia.

Przykład

Następujący przykładowy kod generuje to ostrzeżenie.

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

Aby poprawić to ostrzeżenie, użyj tego numeru:

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

Różne definicje API mogą używać różnych stosów.Na przykład GlobalAlloc używa sterty systemu i free używa sterty procesu.To może spowodować zepsucie pamięci i ulega awarii.

Te niespójności stosuje się do new/delete i malloc/free mechanizmów alokacji pamięci.Aby całkowicie uniknąć tego rodzaju potencjalne nieścisłości, należy użyć mechanizmów, które są dostarczane przez C++ biblioteki szablon standardowy (STL).Należą do nich shared_ptr, unique_ptr, i wektor.Aby uzyskać więcej informacji, zobacz Inteligentne kursory (Podręcznik programowania C++ nowoczesny) i Biblioteka języka C++ wzorcowego.

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

Zobacz też

Informacje

calloc

funkcja malloc

free

operator new (<new>)

usunąć operatora (C++)

shared_ptr

unique_ptr

Koncepcje

Inteligentne kursory (Podręcznik programowania C++ nowoczesny)