c++ - 为什么delete后的指针不能解引用输出?而被智能指针的析构释放的指针可以解引用输出(尽管拿到的是垃圾数据)呢?

浏览:26日期:2023-04-20

问题描述

//方案1 int *ip = new int(42); int *alpha = new int(10); shared_ptr<int>q1 (alpha); shared_ptr<int> p1(ip); p1 = q1; //将引用计数置为0 cout <<'ip(释放后):' <<*ip << endl; //可以输出 //方案2 int *test1 = new int(4); delete(test1); cout << *test1 << endl; //提示内存错误,读取位置发生访问冲突//方案3 int a=10; int *test2=&a; delete(test2); cout<< *test2<< endl; //提示_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

请问这是为什么? delete和智能指针释放内存的机制有什么区别?方案2和方案3有什么区别?为什么错误不一样呢?

问题解答

回答1:

shared_ptr默认也是调用delete,所以理论上和delete的机制没什么区别

delete后再访问的行为是不确定的,什么情况都能发生,比如你这块内存还没别人用,那么访问就还是原来的值,或者变成0了;如果被别人用了,那什么都会发生,这种就是所谓的野指针。所以你这里share_ptr和delete的行为不一样也正常,你可以运行多次看看结果如何。

方案2的a是在堆上分配的,方案3是在栈上分配的,delete只能用来释放堆上的内存(或者说new出来的内存),不能释放栈上的,所以会报_BLOCK_TYPE_IS_VALID的错。栈上内存在函数退出时由系统自动释放

相关文章: