如何释放数组中N个元素的内存

时间:2013-09-11 22:37:18

标签: c++

与我正在修复的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;我该如何解决这个错误? 感谢。

2 个答案:

答案 0 :(得分:4)

  

我该如何解决此错误?

删除演员表,并查找已分配_data的地方。

  • 如果已将其分配为new [someLength],请替换为delete[] _data;
  • 否则(尽管不太可能)替换为delete _data

从长远来看,最好使用动态容器(如std::vector<unsigned int>)来动态分配基元数组。我知道这可能超出了您当前重构的范围。

答案 1 :(得分:2)

首先,检查您是否在代码中的某处动态分配_data。如果没有new表达式,则不得使用delete

如果它是使用new动态分配的,那么当你需要释放该对象时,你应该问自己:“这个指针指向一个对象,还是指向一个对象数组?”。这非常重要,因为内存布局在每种情况下都不同,delete必须事先知道它应该调用多少个析构函数。如果它调用了错误数量的析构函数,则会发生未定义的行为。

经验法则是使用delete []当且仅当您在new表达式中使用[]分配该对象时。