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



与我正在修复的 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表达式中使用 [] 分配该对象时。

最新更新