没有“new”的C ++删除运算符[重复]

Posted

技术标签:

【中文标题】没有“new”的C ++删除运算符[重复]【英文标题】:C++ delete operator without "new" [duplicate] 【发布时间】:2018-07-16 14:23:16 【问题描述】:

是否可以在没有 new 运算符的类实例上使用 delete 运算符来释放内存?像这样:

Class myclasspublic void histd::cout<<"hi\n";;

myclass class1;
delete &class1;
class1.hi(); //results in error

谢谢

【问题讨论】:

可能:是,正确:不可能。对于每个new,应该有一个delete,反之亦然 你认为你为什么需要这样做? 我只是好奇 :D 我很确定这在语言标准和每个 C++ 教程中都有明确说明。现在你不能那样做。对于大多数实现,内存驻留在堆栈上,不能被释放,也不能以有意义的方式使用它。阅读堆栈和堆(例如 here 以更好地理解底层机制,但请记住这是实现细节,而不是 C++ 语言。 @RPGillespie:对我来说唯一有趣的问题是如果你有类似delete new foo[1];的东西会发生什么@ 【参考方案1】:

不,行为将是未定义

您只应在new 提供给您的指针上使用delete。指针的类型也需要相同,除非它指向一个适当的多态类实例。

【讨论】:

那为什么程序在delete操作符后调用函数会出错而不是delete操作符呢? @Nick:这是未定义行为的一种表现。非正式地,你可能已经完全耗尽了你的筹码。 是不是说delete其实就是删除了非指针类型的对象? @Nick:也许,也许不是。我认为您没有理解这里未定义行为的含义。 不,未定义的行为意味着它可以做任何事情。它可能因实现、编译器版本甚至使用某些通用代码部分的不同程序而异。它可能会发生你期望它做的事情,但行为是绝对不稳定的,不能依赖。

以上是关于没有“new”的C ++删除运算符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

mysql self join with group_concat 并且没有重复

删除没有不同的重复值并更改为 NULL 值

C中输入的字符计数[重复]

JAVA重复 new 会怎么样

C ++删除[]运算符[重复]

我的邮件没有被php函数mail()发送[重复]