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


C6279

Обновлен: Ноябрь 2007

C6279

Предупреждение C6279: <переменная> выделяется скалярной операцией new, удаляется операцией массива delete [].

Это предупреждение возникает только в коде C++ и означает, что вызывающая функция несогласованно выделила память с помощью скалярного оператора new, но высвободила ее с помощью оператора массива delete []. Если память выделяется с помощью скалярного оператора new, ее следует высвобождать с помощью скалярного оператора delete.

Существует по крайней мере три причины возникновения неполадок из-за этого.

  • Конструкторы индивидуальных объектов в массиве не вызываются, тогда как деструкторы вызываются.

  • Если глобальный (или относящийся к определенному классу) оператор new и оператор delete несовместимы с оператором new[] и оператором delete[], могут возникнуть непредвиденные результаты.

Последствия этой неполадки трудно спрогнозировать в точности. Может возникнуть непредвиденное повеление или сбои из-за использования неинициализированной памяти, поскольку конструкторы не вызываются. Также может возникнуть выделение памяти и сбои в случае переопределения операторов. В редких случаях несоответствие может не иметь последствий. Программа анализа в настоящее время не делает различий между этими случаями.

Пример

Данное предупреждение создается следующим кодом:

class A
{
  // members
};

void f ( )
{
  A *pA = new A;
  //code ...
  delete[] pA;
}

Для устранения этого предупреждения используйте следующий код:

void f( )
{
  A *pA = new A;
  //code ...
  delete pA;
}