问题描述
//方案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的错。栈上内存在函数退出时由系统自动释放