Предупреждение 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_ptr
vector
Дополнительные сведения см. в разделе "Смарт-указатели " и "Стандартная библиотека 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
Интеллектуальные указатели
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по