C6280
Предупреждение C6280: Память для <переменная> выделена при помощи <функция>, а удаляется при помощи <функция>
Данное предупреждение означает, что вызывающая функция несогласовано выделила память с помощью функции из одного семейства выделения памяти, а освободила ее с помощью функции из другого семейства выделения памяти.Анализатор проверяет наличие этого условия, только если указана аннотация SAL _Analysis_mode_(_Analysis_local_leak_checks_).По умолчанию эта аннотация указана для кода в режиме ядра Windows (драйвера).Дополнительные сведения об аннотациях SAL см. в разделе Использование аннотаций SAL для сокращения количества дефектов в коде C/C++.
Например, это предупреждение будет создано, если память выделяется с помощью функции malloc, а освобождается с помощью функции GlobalFree или delete.В определенных случаях несоответствия между массивом new[] и скалярной функцией delete, вместо этого предупреждения выводятся более конкретные.
Пример
Это предупреждение создается в следующем примере кода.
// 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;
}
Для устранения этого предупреждения используйте этот код:
// 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);
}
Разные определения интерфейсов API могут использовать разные кучи.Например, GlobalAlloc использует системную кучу, и free использует кучу процесса.Это может привести к повреждениям памяти и сбоям.
Эти несоответствия применяются к механизмам выделения памяти new/delete и malloc/free.Чтобы избежать все эти типы возможных несоответствий, используйте механизмы, предоставляемые библиотекой стандартных шаблонов (STL) C++.Они включают shared_ptr, unique_ptr и vector.Дополнительные сведения см. в разделах Интеллектуальные указатели (современный C++) и Справочник по стандартной библиотеке C++.
// 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.
}