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
Koncepcje
Inteligentne kursory (Podręcznik programowania C++ nowoczesny)