C6278

更新:2007 年 11 月

警告 C6278:<variable> 使用数组 new [] 分配,但使用标量 delete 删除。析构函数将不被调用

此警告仅在 C++ 代码中出现,它意味着调用函数存在下面的不一致现象:它用数组“new []”运算符分配内存,却用标量“delete”运算符来释放内存。按照 C++ 标准和 Microsoft VC++ 实现,这是未定义的行为。这很可能会造成问题,原因至少有三个:

  • 调用了数组中各个对象的构造函数,但是未调用析构函数。

  • 如果全局或类特定的“operator new”和“operator delete”与“operator new[]”和“operator 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 警告。