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


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 C-++.Они включают shared_ptr, unique_ptr и вектор.Дополнительные сведения см. в разделах Интеллектуальные указатели (самомоднейшее 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

free

operator new (<new>)

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

shared_ptr

unique_ptr

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

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