以下删除对象数组有什么区别吗?
第一种方式:
MyClass **obj = new MyClass*[NUM];
for (int i=0; i<NUM; i++) obj[i] = new MyClass(val);
obj[0]->method();
for (int i=0; i<NUM; i++) delete obj[i]; /// Deletion1
delete obj; /// Deletion1
第二种方式:
MyClass **obj = new MyClass*[NUM];
for (int i=0; i<NUM; i++) obj[i] = new MyClass(val);
obj[0]->method();
delete[] obj; /// Deletion2
obj = 0x0; /// Deletion2
两种方法都可行,并且在调试器中看起来相似。
最佳答案
在第一个示例中,您将为分配的数组的成员指向的每个对象显式调用析构函数。然后,您将删除指针数组(实际上应该是delete[]
,因为您将其分配为数组,但是在本示例中,实际上这并不重要)。
在第二个示例中,您仅删除了指针数组,该数组不为指向对象调用析构函数。这样做的原因不是因为您可能已经在编译器不一定知道的其他变量中复制了这些指针。
如果要创建对象而不是指针的数组,则如下所示:
MyClass *obj = new MyClass[NUM];
那么
delete[]
运算符将为分配的数组中的每个NUM
对象自动调用析构函数。