在C ++中删除malloc的行为

时间:2012-06-01 16:38:15

标签: c++ malloc delete-operator

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

delete p;

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

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

此外,如果我们使用new进行反向和分配并使用免费发布,那么也没有错误或警告。

为什么会这样?

3 个答案:

答案 0 :(得分:30)

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

答案 1 :(得分:8)

  

那么应该有一些错误

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

C ++标准(以及建立C ++标准的C标准)将此类错误称为未定义行为。通过 undefined ,它们意味着任何事情都可能发生。程序可能会正常继续,它可能会立即崩溃,它可能会生成一个明确定义的错误消息并正常退出,它可能会在实际未定义的行为事件之后的某个时间开始显示随机错误,或invoke nasal demons

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

答案 2 :(得分:2)

使用free()而非delete

如果您malloc,则必须致电free以释放内存。

如果您new,则必须致电delete以释放内存。

Here是一个解释它的链接。