【发布时间】:2014-03-28 23:58:08
【问题描述】:
在对项目进行了大量更改后,我创建了一个错误,我花了很长时间才找到。
我有一个包含动态分配数组的类。然后我创建这个类的动态数组。然后我可以删除[]那个数组。但是,如果我在删除之前替换数组中的某个项目,则会导致错误。在调试模式下,它会给出来自 dbgdel.cpp 的断言消息“表达式:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)”。这是一个小程序来演示。
class SomeClass {
public:
int *data;
SomeClass() {
data = nullptr;
}
SomeClass(int num) {
data = new int[num];
}
~SomeClass() {
if (data != nullptr) {
delete[] data;
}
}
};
int main(int argc, char *args[]) {
SomeClass *someArray = new SomeClass[10];
//If you comment this out, there is no error. Error gets thrown when deleting
someArray[0] = SomeClass(10);
delete[] someArray;
return 0;
}
我很好奇,为什么会这样?当数组中的项目被替换时,它的析构函数被调用。然后,新项目将其数据分配到与数组分开的位置。然后 delete[] 调用数组中所有对象的析构函数。当调用析构函数时,它们应该删除项目的数据数组。我无法想象问题出在哪里,但我希望有人能解释一下。
【问题讨论】:
-
+1 用于创建最小的测试用例 ;)
-
if (data != nullptr)是僵尸编程的例子。 -
+1 以良好的方式提出问题。我的建议是尽可能多地使用智能指针、STL 容器和 RAII,这样一开始就不会遇到这类问题。
-
OliCharlesworth 是的,我认为其他人和我一样讨厌阅读不相关的材料 :) KerrekSB 我实际上并没有这样做。为了清楚起见,我只是添加了它。
-
@JanzDott:这不是“清晰”的含义:-S ...这就像说
return x不如return x == true ? true : false清晰。
标签: c++ arrays dynamic delete-operator