删除堆然后取消引用指向该内存的指针

bug*_*t77 4 c++ heap pointers

这是练习中的代码:

#include <iostream>
using namespace std;

int main() {
    int n = 13;
    int* ip = new int(n + 3);
    int* ip2 = ip;
    cout << *ip << endl;
    delete ip;
    cout << *ip2 << endl;
    cout << ip << tab << ip2 << endl;
}
Run Code Online (Sandbox Code Playgroud)

当删除分配给堆上的int的空间时,我认为取消引用指针会产生某种内存错误.相反,它返回0.

为什么是这样?

Meh*_*ari 14

取消引用无效指针会导致每个规范的结果不确定.它不能保证失败.

通常(CPU/OS /编译器/ ...依赖),编译器根本不关心它.它只是给出了当前内存地址的内容.例如,在x86架构中,你只看到一个错误,只有当该地址是在并非映射到你的进程(或者你的进程没有权限访问)内存页面,从而异常将由CPU抛出(保护故障)操作系统将适当处理(并可能使您的过程失败).特技有时被用来使访问地址0总是会导致访问冲突:操作系统设置的读/写页表的地址空间的第一页的位为0,即到该网页的任何访问总是会产生一个异常.