在C++中删除malloc的行为

Luv*_*Luv 27 c++ malloc delete-operator

int *p=(int * )malloc(sizeof(int));

delete p;
Run Code Online (Sandbox Code Playgroud)

当我们使用malloc分配内存时,我们应该使用free释放它,当我们在C++中使用new分配时,我们应该使用delete释放它.

但是如果我们使用malloc分配内存然后使用delete,那么应该会有一些错误.但是在上面的代码中,C++中没有错误或警告.

此外,如果我们使用new进行反向和分配并使用free进行释放,那么也没有错误或警告.

为什么会这样?

Cat*_*lus 33

这是未定义的行为,因为没有办法可靠地证明指针后面的内存是正确分配的(即newfor deletenew[]for delete[]).这是你的工作,以确保这样的事情不会发生.使用正确的工具,即智能指针,这很简单.每当你说delete,你做错了.

  • 基本上,C++标准说如果用`malloc`分配并且用`delete`自由分配,你就可以发动核攻击.你真的不希望这样吗,你呢?好吧,让我们做到这一点:如果你坚持这样做,你会在几个月或几年之后,即你去家庭度假前3天支付费用,而你将花费48小时直接解决问题.这就是未定义的行为在实践中意味着什么.不眠之夜. (4认同)
  • 哇,哇,我一直陪着你,直到您的最后一句话,我*喜欢*智能指针。但是,它们并不总是可以适当地替代new / delete(例如,如果您正在编写自己的智能指针类,并且要在没有标准库的情况下部署到嵌入式计算机上,该怎么办?使用仅提供auto_ptr作为智能指针的旧编译器?),因此不必说使用delete会“做错了”(即使确实是智能指针通常是更好的方法)。 (3认同)
  • @KyleStrand呃那些愚蠢的论点一次又一次地出现.如果您正在编写自己的智能指针类或编写嵌入式软件,那么您不会想知道是否可以混合使用malloc和delete.错误的观众.除了你编写自己的智能指针的情况接近0,因为unique_ptr对于几乎所有东西都是通用的(而其他情况是shared_ptr或深度克隆的value_ptr,并且所有这些都已经写好了).如果你被5年以上的编译器困住,那么*有人*做错了肯定(也是Boost). (2认同)

n. *_* m. 9

那应该有一些错误

有.这不一定是显而易见的.

C++标准(以及建立C++标准的C标准)将这种错误定义未定义的行为.通过不确定他们的意思是,在所有的事情可能发生.程序可能会正常继续,它可能会立即崩溃,它可能会产生一个明确定义的错误消息并优雅地退出,它可能会在实际的未定义行为事件之后的某个时间开始出现随机错误,或者调用鼻子恶魔.

您有责任注意并消除这些错误.没有什么能保证在发生时提醒您.


and*_*dre 5

使用free()delete

如果你那么malloc你必须打电话free来释放内存。

如果你new必须调用delete释放内存。

是一个解释它的链接。