C ++中delete和delete []的区别

时间:2011-01-12 15:50:14

标签: c++ memory-management

  

可能重复:
  delete vs delete[] operators in C++

我写了一个包含两个指针的类,一个是char* color_,另一个是vertexesset* vertex_,其中vertexesset是我创建的类。在我开始写的destractor中

delete [] color_;
delete [] vertex_;

当涉及到析构函数时,它给了我一个分段错误。

然后我将析构函数更改为:

delete [] color_;
delete vertex_;

现在它工作正常。这两者有什么区别?

9 个答案:

答案 0 :(得分:58)

delete []当您new编辑数组类型时,delete当您没有typedef int int_array[10]; int* a = new int; int* b = new int[10]; int* c = new int_array; delete a; delete[] b; delete[] c; // this is a must! even if the new-line didn't use []. 时。{{1}}例子:

{{1}}

答案 1 :(得分:14)

deletedelete[]不是一回事!维基百科explains这个,如果简单的话。简而言之,delete []在分配的数组中的每个元素上调用析构函数,而delete假设您只有一个实例。您应该使用new foo[]分配数组,并使用delete[]删除它们;对于普通对象,请使用newdelete。在非阵列上使用delete[]可能会导致严重破坏。

答案 2 :(得分:7)

  • 如果使用malloc()进行分配,则使用free()
  • 如果您使用新分配,请使用删除
  • 如果您使用new []进行分配,请使用delete []
  • 如果使用placement-new构建,则直接调用析构函数
  • 如果使用vector而不是new []是有意义的,那么使用它
  • 如果使用智能指针是有意义的,那么使用它们并且不打扰调用删除(但你仍然需要调用new)。匹配删除将在智能指针中。

https://isocpp.org/wiki/faq/freestore-mgmt

答案 3 :(得分:5)

如果使用operator new [](例如动态数组)在堆上分配内存,则必须使用delete []。

如果您使用operator new,则必须使用operator delete,而不使用方括号。

与删除内置类型或自定义类无关。

答案 4 :(得分:4)

当我们想要释放分配给指向对象的指针的内存时,则使用“删除”。

int * p;
p=new int;

// now to free the memory 
delete p;

但是当我们为像

这样的对象数组分配内存时
int * p= new int[10]; //pointer to an array of 10 integer

然后释放等于10个整数的内存:

 delete []p;

注意:即使delete p;也可以释放内存,但它只释放第一个元素内存。

答案 5 :(得分:1)

如果你有Effective C++ part 1参考第5项:在相应的新用途和删除中使用相同的表格。

答案 6 :(得分:0)

  

现在它工作正常。

更幸运的是判断是否存在,并且您确定它确实有效吗?

必须调用每个对象的析构函数,delete[]运算符使用new[]设置的信息来确定要销毁的对象数。因此虽然delete本身可以恢复内存(尽管它是否依赖于实现),但它可能不会为每个分配的对象调用析构函数。

有可能在调用newnew[]时包含有关如何分配对象的信息,以便无论如何都使用正确的删除形式,但这又是依赖于实现的不保证。

答案 7 :(得分:0)

Raymond Chen在其名为Mismatching scalar and vector new and delete的博客中详细介绍了缩放器和矢量删除的工作原理。

以上文章中链接指向错误链接的InformIT文章:http://www.informit.com/articles/article.aspx?p=30642

答案 8 :(得分:0)

另外(显然我的打字速度应该提高:),如果你没有真的必须要考虑不使用指针。例如char*可以替换为std::string,如果您的vertexesset成员不是多态的,则可以将其设为成员对象。在这种情况下,您根本不需要delete