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 []newed 数组类型,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】:

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

【讨论】:

这应该是答案,它实际上解释了差异。谢谢。 是的,这失去了 40 票,因为 2 分钟后。需要注意的是,您不能使用 delete[] 作为处理原始指针的包罗万象的解决方案。 为什么 C++ 运行时不弄清楚数组和非数组类型之间的区别,以便程序员可以使用单个 delete 语句? 它必须是编译器,而不是运行时。运行时只看到对mallocfree 的调用(例如)。【参考方案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 自己可以恢复内存(尽管它是否恢复依赖于实现),但它可能不会为每个分配的对象调用析构函数。

当调用newnew[] 时,可能会包含有关如何分配对象的信息,以便无论如何都使用正确的删除形式,但这同样取决于实现并且不能保证。

【讨论】:

【参考方案9】:

此外,如果您不需要真的,请考虑不使用指针。例如char* 可以替换为std::string,如果你的vertexesset 成员不是多态的,你可以让它成为一个成员对象。在这种情况下,您根本不需要delete

【讨论】:

以上是关于C++中delete和delete[]的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章

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

c的free和c++的delete的区别

[c++基础] delete 和 delete []的区别

C++中delete与 delete []区别

百战c++

百战c++