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

delete p;

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

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

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

为什么会这样?

4

3 回答 3

36

这是未定义的行为,因为无法可靠地证明指针后面的内存已正确分配(即通过newfordeletenew[]for delete[])。确保此类事情不会发生是你的工作。当您使用正确的工具(即智能指针)时,这很简单。每当你说delete,你做错了。

于 2012-06-01T16:40:31.513 回答
13

那么应该有一些错误

有。只是不一定很明显。

C++ 标准(以及 C++ 标准所依据的 C 标准)将这种错误称为未定义行为。未定义意味着任何事情都可能发生。程序可能会正常继续,可能会立即崩溃,可能会产生明确定义的错误消息并优雅退出,可能会在实际未定义行为事件发生后的某个时间开始出现随机错误,或者调用鼻恶魔

您有责任注意并消除这些错误。没有任何事情可以保证在它们发生时提醒您。

于 2012-06-01T16:55:39.300 回答
5

free()不使用delete

如果你malloc那么你必须调用free释放内存。

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

是一个解释它的链接。

于 2012-06-01T16:40:56.757 回答