在指向int的指针上调用delete

Calling delete on a pointer to an int

本文关键字:调用 delete 指针 int      更新时间:2023-10-16

假设我有一个简单的程序:

int main()
{
    int myInt = 12;
    int* intPtr = &myInt;//alias
    std::cout << *intPtr << "n";
    delete intPtr; //This statement makes the program crash, why?
    return 0;
}

我的问题是上面节目中的评论。

关于可能导致崩溃的原因,我的猜测是,当myInt超出范围时,当程序完成时,它会从堆栈中删除,但内存已经被删除,但我不确定。

基本上,这是因为运行时使用一些数据结构来存储有关已动态分配的所有内存块的信息。当您在指针上调用delete时,运行时会在数据结构中查找指针,并标记出以某种方式释放的相应内存块。运行时通常不会检查传入的指针是否真的分配了new:这是程序员的责任。如果你违反了delete的前提条件,那么内存管理算法会做一些不可预测的事情,当涉及内存的不可预测事情发生时,结果往往是崩溃。

这是未定义行为的一个很好的例子。运行时可以检查指针是否分配了new,但这会减慢程序的速度。允许某些东西是未定义的行为可以生成更高效的代码。

对从new返回的指针以外的任何对象使用delete都是未定义的行为。在从new[]返回的指针之外的任何对象上使用delete[]都是UB。在从malloc返回的指针之外的任何东西上使用free都是UB。

Valgrind和其他内存清理程序通常可以检测到这种问题,但如果你的程序设计得很好(使用更多的智能指针!),那么无论如何都不会发生这种情况。