1

Related to the program from 2004 that I'm fixing. The former developer used the following code to free 'len' elements of an array in the destructor:

unsigned int* _data;  
...  
if (_data) {
  int len = size();
  delete (unsigned int[len]) _data;
}

I can't compile this code with my compiler. The error message is:

error: ISO C++ forbids casting to an array type ‘unsigned int [(((unsigned int)(((int)l) + -0x00000000000000001)) + 1)]’</p>

There must be a reason he didn't use delete _data;How should I fix this error?
Thanks.

4

2 回答 2

5

我应该如何解决这个错误?

移除演员表,并寻找_data已分配的地方。

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

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

于 2013-09-11T22:39:57.947 回答
2

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

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

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

于 2013-09-11T22:55:56.330 回答