C6278
警告 C6278:<variable> 使用数组 new [] 分配,但使用标量 delete 删除。 析构函数将不被调用
此警告仅在 C++ 代码中出现,它意味着调用函数存在下面的不一致现象:它用数组**“new []”运算符分配内存,却用标量“delete”**运算符来释放内存。 这是未定义的行为基于标准的C++和Microsoft Visual C++实现。 这很可能会造成问题,原因至少有三个:
调用了数组中各个对象的构造函数,但是未调用析构函数。
如果全局或类特定的**“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 警告。