Поделиться через


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

См. также

Ссылки

calloc

malloc

свободные

operator new (<new>)

Оператор delete (C++)

shared_ptr

unique_ptr

Основные понятия

Интеллектуальные указатели (современный C++)