C++ 删除对象数组的方式不同

C++ 删除对象数组的方式不同,c++,arrays,object,C++,Arrays,Object,以下对象数组的删除是否存在一些差异 第一种方式: 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();
for (int i=0; i<NUM; i++) delete obj[i]; /// Deletion1
delete obj;                              /// Deletion1
MyClass**obj=newmyclass*[NUM];
对于(int i=0;imethod();

对于(int i=0;i两者都不正确。正确的方法是:

for (int i = 0; i < NUM; i++) delete obj[i];
delete[] obj;
for(int i=0;i
在显示的第一种方式中,使用
delete
销毁分配了
new[]
的对象,这会导致未定义的行为(如果使用
new[]
,则必须使用
delete[]
销毁对象)

在第二种方式中,您泄漏了在第一个for循环中创建的所有指针


如果您使用
std::vector
而不是动态分配的数组和某种类型的智能指针,那么在大多数代码中您不必担心这一点。

在第一个示例中,您为分配数组的成员指向的每个对象显式调用析构函数。然后,您将删除指针数组(实际上应该是
delete[]
,因为您将其分配为数组,但在本例的实践中,这可能并不重要)

在第二个示例中,您只删除了指针数组,而指针数组不调用指向对象的析构函数。之所以不删除,是因为您可能在编译器不一定知道的其他变量中复制了这些指针

如果要创建对象数组而不是指针数组,如下所示:

MyClass *obj = new MyClass[NUM];

然后,
delete[]
操作符将自动为分配数组中的每个
NUM
对象调用析构函数。

可能重复的“obj=0x0;///Deletion2”评论是谎言的一个很好的例子!正确答案根本不是。如果你必须手动删除某些内容,那么你就错了。克里斯,我不这么认为。像你所说的那样,解释对我来说是不够的。约翰西韦布,这是一个边界标志,这是一个真正的评论。显然,样本正在调查家庭作业之类的事情。谢谢我不想使用你建议的方式的原因是使用了非def构造函数new MyClass(val)。我只是对删除的疑问感到困惑。
MyClass *obj = new MyClass[NUM];