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