没有“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 ++删除运算符[重复]的主要内容,如果未能解决你的问题,请参考以下文章