我写了一个包含两个指针的类,一个是char* color_
,另一个是vertexesset* vertex_
,其中vertexesset
是我创建的类。在我开始写的destractor中
delete [] color_;
delete [] vertex_;
当涉及到析构函数时,它给了我一个分段错误。
然后我将析构函数更改为:
delete [] color_;
delete vertex_;
现在它工作正常。这两者有什么区别?
答案 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)
delete
和delete[]
不是一回事!维基百科explains这个,如果简单的话。简而言之,delete []
在分配的数组中的每个元素上调用析构函数,而delete
假设您只有一个实例。您应该使用new foo[]
分配数组,并使用delete[]
删除它们;对于普通对象,请使用new
和delete
。在非阵列上使用delete[]
可能会导致严重破坏。
答案 2 :(得分:7)
答案 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
本身可以恢复内存(尽管它是否依赖于实现),但它可能不会为每个分配的对象调用析构函数。
有可能在调用new
或new[]
时包含有关如何分配对象的信息,以便无论如何都使用正确的删除形式,但这又是依赖于实现的不保证。
答案 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