int *p=(int * )malloc(sizeof(int));
delete p;
当我们使用 malloc 分配内存时,我们应该使用 free 释放它,当我们在 C++ 中使用 new 分配时,我们应该使用 delete 释放它。
但是如果我们使用malloc分配内存然后使用delete,那么应该会有一些错误。但是在上面的代码中,C++ 中没有错误或警告。
此外,如果我们使用 new 反转和分配并使用 free 释放,那么也没有错误或警告。
为什么会这样?
int *p=(int * )malloc(sizeof(int));
delete p;
当我们使用 malloc 分配内存时,我们应该使用 free 释放它,当我们在 C++ 中使用 new 分配时,我们应该使用 delete 释放它。
但是如果我们使用malloc分配内存然后使用delete,那么应该会有一些错误。但是在上面的代码中,C++ 中没有错误或警告。
此外,如果我们使用 new 反转和分配并使用 free 释放,那么也没有错误或警告。
为什么会这样?
这是未定义的行为,因为无法可靠地证明指针后面的内存已正确分配(即通过new
fordelete
或new[]
for delete[]
)。确保此类事情不会发生是你的工作。当您使用正确的工具(即智能指针)时,这很简单。每当你说delete
,你做错了。
那么应该有一些错误
有。只是不一定很明显。
C++ 标准(以及 C++ 标准所依据的 C 标准)将这种错误称为未定义行为。未定义意味着任何事情都可能发生。程序可能会正常继续,可能会立即崩溃,可能会产生明确定义的错误消息并优雅退出,可能会在实际未定义行为事件发生后的某个时间开始出现随机错误,或者调用鼻恶魔。
您有责任注意并消除这些错误。没有任何事情可以保证在它们发生时提醒您。