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

SIM*_*MEL 34 c++ memory-management

可能重复:
C++中的delete vs delete []运算符

我已经写了包含两个指针类,一个是char* color_和一个在vertexesset* vertex_那里vertexesset是一类我创建.在我开始写的destractor中

delete [] color_;
delete [] vertex_;
Run Code Online (Sandbox Code Playgroud)

当它来到析构函数时,它给了我一个分段错误.

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

delete [] color_;
delete vertex_;
Run Code Online (Sandbox Code Playgroud)

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

eta*_*ion 59

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 [].
Run Code Online (Sandbox Code Playgroud)

  • +1用于提及int_array的情况. (8认同)
  • 从评论复制到另一个答案:使用数组typedef是一个坏主意,但提及它并不是一个坏主意,人们会被它所咬.另外,重点是即使你_wrote_`new`,你有时需要_write_`delete []`. (2认同)

Eme*_*ger 18

delete并且delete[]是不一样的东西!维基百科如果简要地解释了这一点.简而言之,在分配的数组中的每个元素上delete []调用析构函数,同时假设您只有一个实例.您应该分配数组并删除它们; 对于普通物体,使用和.使用非阵列上可能会导致混乱.deletenew foo[]delete[]newdeletedelete[]

  • 这应该是答案,它实际上解释了差异。谢谢。 (2认同)

Cas*_*Cow 7

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

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


Fra*_*sco 5

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

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

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

  • 你在哪里知道它没有伤害?这是不对的. (8认同)
  • @ypnos:在什么宇宙中未定义的行为*不会受到伤害?:) (3认同)
  • 未定义的行为总会伤害,并不总是立刻. (3认同)