C6278
Предупреждение C6278: Память для <переменная> выделена при помощи оператора new [] для массивов, а удаляется скалярным оператором delete.Деструкторы не будут вызваны.
Это предупреждение возникает только в коде C++ и указывает, что вызывающая функция выделила память при помощи оператора массива new [], но высвободила память при помощи скалярного оператора delete.Это является неопределенным поведением согласно стандарту C++ и реализации Microsoft Visual C++.Существует по крайней мере три причины возникновения неполадок из-за этого.
Для отдельных объектов в массиве вызываются конструкторы, но не вызываются деструкторы.
Если глобальный (или относящийся к определенному классу) оператор new и оператор delete несовместимы с оператором new[] и оператором delete[], могут возникнуть непредвиденные результаты.
Не следует полагаться на неопределенное поведение, поскольку это весьма рискованно.
Последствия этой неполадки трудно спрогнозировать в точности.Для классов, для которых деструкторы осуществляют отмену выделения памяти, возможны утечки; возможно неоднородное поведение классов с деструкторами, выполняющими семантически различные операции; возможно повреждение памяти и сбои при переопределении операторов.В прочих случаях несоответствие не имеет большого значения (это зависит от реализации компилятора и его библиотек).Программа анализа не всегда различает эти ситуации.
Если память выделяется при помощи оператора массива new [], ее, как правило, следует высвобождать при помощи оператора массива delete[].
Пример
Это предупреждение создается в следующем примере кода:
class A
{
// members
};
void f( )
{
A *pA = new A[5];
// code ...
delete pA;
}
Для устранения этого предупреждения используйте следующий пример кода:
void f( )
{
A *pA = new A[5];
// code ...
delete[] pA;
}
Если нижележащий объект в массиве имеет примитивный тип, такой как int, float, enum или указатель, нет необходимости вызывать деструктор.В этих случаях возникает предупреждение C6283.
Использование new и delete имеет много опасностей в терминах утечки памяти и исключений.Чтобы избежать все такие проблемы утечек и исключений, используйте механизмы, предоставляемые библиотекой стандартных шаблонов (STL) C++.Они включают shared_ptr, unique_ptr и vector.Дополнительные сведения см. в разделах Интеллектуальные указатели (современный C++) и Справочник по стандартной библиотеке C++.