C++中delete和delete[]的区别[重复]
Posted
技术标签:
【中文标题】C++中delete和delete[]的区别[重复]【英文标题】:The difference between delete and delete[] in C++ [duplicate] 【发布时间】:2011-06-07 22:23:16 【问题描述】:可能重复:delete vs delete[] operators in C++
我编写了一个包含两个指针的类,一个是char* color_
,一个在vertexesset* vertex_
,其中vertexesset
是我创建的一个类。在我开始写的析构函数中
delete [] color_;
delete [] vertex_;
当它涉及到析构函数时,它给了我一个分段错误。
然后我把析构函数改成:
delete [] color_;
delete vertex_;
现在它工作正常。两者有什么区别?
【问题讨论】:
你能贴出你分配两个指针的代码吗?即新的部分。 你关注Rule of Three了吗? ***.com/questions/1553382/… 【参考方案1】:delete []
new
ed 数组类型,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 用于提及 int_array 的情况。 从评论复制到另一个答案:使用数组类型定义是一个坏主意,但提及它也不是一个坏主意,人们会被它咬伤。另外,重点是即使你写new
,你有时也需要写 delete[]
。
有人编辑了 typedef - 现在(和原来的)方式是正确的,请在编辑之前尝试您的“修复”。请参阅ideone.com/fYh6MK 与 ideone.com/w9fPKr
我很想知道如果您有以下要求,您需要什么:char** strings = new char*[2];字符串[0]=新字符[10];字符串[1] = 新字符[10]; delete [] strings 会清除所有内存还是只清除字符串数组,让我清除两个 char 数组?
@Mahen 它只会删除指向字符串的指针,预先删除数组内容。【参考方案2】:
delete
和 delete[]
不是一回事!***explains这个,如果简短的话。简而言之,delete []
在分配的数组中对每个元素 调用析构函数,而delete
假设您只有一个实例。您应该使用new foo[]
分配数组并使用delete[]
删除它们;对于普通对象,使用new
和delete
。在非数组上使用 delete[]
可能会导致严重破坏。
【讨论】:
这应该是答案,它实际上解释了差异。谢谢。 是的,这失去了 40 票,因为 2 分钟后。需要注意的是,您不能使用 delete[] 作为处理原始指针的包罗万象的解决方案。 为什么 C++ 运行时不弄清楚数组和非数组类型之间的区别,以便程序员可以使用单个delete
语句?
它必须是编译器,而不是运行时。运行时只看到对malloc
和free
的调用(例如)。【参考方案3】:
如果使用 malloc() 分配,则使用 free()
如果您使用 new 分配,则使用 delete
如果使用 new[] 分配,则使用 delete[]
如果使用placement-new 构造,则直接调用析构函数
如果使用 vector 而不是 new[] 有意义,请使用它
如果使用智能指针有意义,请使用它们,不要费心调用 delete(但您仍然需要调用 new)。匹配的删除将在智能指针中。
https://isocpp.org/wiki/faq/freestore-mgmt
【讨论】:
If you allocate with new you use delete
- 情况并非总是如此,请参阅我的回答。
@etarion:我在您的回答中没有看到任何与此陈述相矛盾的内容;您使用类型别名 sill 调用 new[]
而不是 new
,类型别名只是混淆了这一事实,并且可能是一个坏主意(即使提及它!)。
使用数组类型定义是个坏主意,但提起来也不错,人们被它咬了。另外,重点是即使你写 new
,你有时也需要写 delete[]
。【参考方案4】:
如果您使用运算符new[]
(例如动态数组)在堆上分配内存,则必须使用delete []
。
如果使用运算符new
,则必须使用运算符delete
,不带方括号。
与删除内置类型或自定义类无关。
【讨论】:
不过,对使用 new 创建的任何内容使用 delete[] 并没有什么坏处。段错误一定有其他原因。 你从哪里得到它不痛的想法?错了。 @ypnos:未定义的行为不在哪个领域受到伤害? :) 未定义的行为总是很痛苦,只是并不总是马上。【参考方案5】:当我们想要释放分配给指向对象的指针的内存时,使用“删除”。
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;
也可以释放内存,但它只会释放第一个元素内存。
【讨论】:
new int(10)
分配单个 int
,而不是 10 个 int
的数组。
嗯谢谢指正
注意:即使通过 delete p; 也可以释放内存,但它只会释放第一个元素的内存。 这个注释是错误的。以下问题解释了原因:https://***.com/questions/4480722/should-new-new-match-delete-delete【参考方案6】:
如果你有Effective C++ part 1,请参考第5条:在new和delete的对应用法中使用相同的形式。
【讨论】:
如果你没有 Effective C++,现在就买吧!【参考方案7】:Raymond Chen 在其名为Mismatching scalar and vector new and delete 的博客中详细介绍了缩放器和矢量删除的工作原理。
这是上面文章中错误链接的 InformIT 文章的链接:http://www.informit.com/articles/article.aspx?p=30642
【讨论】:
【参考方案8】:现在它工作正常。
如果确实如此,那更幸运的是,您确定它真的有效吗?
必须调用每个对象的析构函数,delete[]
运算符使用new[]
设置的信息来确定要销毁多少对象。因此,虽然delete
自己可以恢复内存(尽管它是否恢复依赖于实现),但它可能不会为每个分配的对象调用析构函数。
当调用new
或new[]
时,可能会包含有关如何分配对象的信息,以便无论如何都使用正确的删除形式,但这同样取决于实现并且不能保证。
【讨论】:
【参考方案9】:此外,如果您不需要真的,请考虑不使用指针。例如char*
可以替换为std::string
,如果你的vertexesset
成员不是多态的,你可以让它成为一个成员对象。在这种情况下,您根本不需要delete
【讨论】:
以上是关于C++中delete和delete[]的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章