在指向int的指针上调用delete
Calling delete on a pointer to an int
假设我有一个简单的程序:
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和其他内存清理程序通常可以检测到这种问题,但如果你的程序设计得很好(使用更多的智能指针!),那么无论如何都不会发生这种情况。
相关文章:
- 如何知道何时调用删除以及何时调用 delete[] C++?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 析构函数是否会自动调用 delete[] C++?
- 调用delete[]时,某些东西导致堆损坏,但我已正确设置了数组的维度
- 在析构函数中调用"delete"运算符时"compiler is out of heap space"编译器错误
- 为什么 delete[] 不等同于 C++ 中为每个元素调用 delete?
- 有没有办法拥有一个未初始化的类数组,这些类在调用 delete[] 时不会被破坏?
- 为什么当我在同一内存中各有两个指针时,我必须调用"delete"两次?
- 在C 中调用delete []内部破坏者
- C++17标准对在nullptr上调用delete有何规定
- 对不完整类型的空指针调用delete合法吗
- 每当在C++中调用 delete/delete[] 时都会中断调试器
- WT C 如何为分配的对象调用DELETE
- 复制指针,然后调用 delete
- 正在对自动对象调用delete
- 在对象的动态数组上调用 delete [] 不会释放内存?
- 调用delete[]会中断我的C++程序
- 如何使std::shared_ptr不调用delete()
- 如果我对对象调用 delete,矢量中的对象指针是否被删除
- 当调用 delete[] X 命令时,到底发生了什么以及谁负责