Предупреждение C6280

Имя переменной выделяется с параметром function-name-1, но удаляется с параметром function-name-2.

Это предупреждение указывает, что вызывающая функция несогласованно выделяет память с помощью функции из одной семьи и освобождает ее с помощью функции из другой.

Замечания

Анализатор проверка для этого условия, только если _Analysis_mode_(_Analysis_local_leak_checks_) указана заметка SAL. По умолчанию эта заметка указана для кода режима ядра Windows (driver). Дополнительные сведения об заметках SAL см. в разделе "Использование заметок SAL для уменьшения дефектов кода C/C++".

Например, это предупреждение будет создано, если память выделена с помощью, malloc но освобождена с помощью GlobalFree или delete. В конкретных случаях несоответствия между массивом new[] и скалярными deleteпредупреждениями передаются более точные предупреждения вместо этого.

Имя анализа кода: MEMORY_ALLOCATION_MISMATCH

Пример

Следующий пример кода создает это предупреждение. pInt выделяется с использованием calloc , но освобождается с помощью несогласованной функции delete:

// C6280a_warning.cpp
// 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;
}

Следующий код избегает этого предупреждения с помощью функции freeразмещения сделки, соответствующего calloc:

// C6280a_no_warning.cpp
// 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 памяти. Чтобы избежать этих возможных несоответствий, используйте механизмы, предоставляемые стандартной библиотекой C++ (STL). К ним относятся, например, unique_ptrи контейнеры, такие как.shared_ptrvector Дополнительные сведения см. в разделе "Смарт-указатели " и "Стандартная библиотека C++".

Следующий код полностью избегает этой проблемы с помощью unique_ptr:

// C6280b_no_warning.cpp
// 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
deleteОператор
shared_ptr
unique_ptr
Интеллектуальные указатели