对象数组的以下删除是否存在一些差异?
第一种方式:
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
这两种方式都是可行的,在调试器中看起来很相似。
答案 0 :(得分:4)
两者都不正确。正确的方法是:
for (int i = 0; i < NUM; i++) delete obj[i];
delete[] obj;
在您展示的第一种方式中,使用delete
来销毁使用new[]
分配的对象,这会导致未定义的行为(如果使用new[]
,则必须使用delete[]
来销毁对象std::vector
)。
在第二种显示方式中,泄漏了您在第一个for循环中创建的所有指针。
如果您使用{{1}}而不是动态分配的数组和某种类型的智能指针,那么您在大多数代码中都不必担心这一点。
答案 1 :(得分:3)
在第一个示例中,您显式地为已分配数组的成员指向的每个对象调用析构函数。然后你要删除指针数组(它应该是delete[]
,因为你把它作为一个数组分配了,但实际上这个例子可能无关紧要。)
在第二个示例中,您只是删除指针的数组,它不会为指向对象调用析构函数。它没有的原因是你可能已经在编译器不一定知道的其他变量中复制了那些指针。
如果您要创建一个对象而不是指针的数组,请执行以下操作:
MyClass *obj = new MyClass[NUM];
然后delete[]
运算符会自动为分配的数组中的每个NUM
对象调用析构函数。