与我正在修复的 2004 年程序相关。前开发人员使用以下代码来释放析构函数中数组的"len"元素:
unsigned int* _data;
...
if (_data) {
int len = size();
delete (unsigned int[len]) _data;
}
我无法使用编译器编译此代码。错误消息是:
错误:ISO C++禁止转换为数组类型"无符号 int [((((无符号整数)(((int)l) + -0x00000000000000001))) + 1)]"
他没有使用delete _data;
一定是有原因的 我应该如何解决此错误?
谢谢。
我应该如何修复此错误?
取下石膏,并寻找分配_data
的地方。
- 如果已分配为
new [someLength]
,请替换为delete[] _data;
- 否则(尽管这不太可能)替换为
delete _data
。
从长远来看,最好更喜欢使用动态容器,例如std::vector<unsigned int>
,而不是基元数组的动态分配。不过,我知道这可能超出了您当前重构的范围。
首先,检查您是否在代码中的某个位置动态分配_data
。如果没有new
表达式,则不得使用 delete
。
如果使用 new
动态分配它,那么当您需要释放该对象时,您应该问自己:"这个指针是指向单个对象,还是指向对象数组?这非常重要,因为每种情况下的内存布局都不同,delete
必须提前知道它应该调用多少个析构函数。如果它调用了错误数量的析构函数,则会发生未定义的行为。
经验法则是使用 delete []
当且仅当在new
表达式中使用 [] 分配该对象时。