//方案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有什么区别?为什么错误不一样呢?
shared_ptr預設也是呼叫delete,所以理論上和delete的機制沒什麼差別
delete後再訪問的行為是不確定的,什麼情況都能發生,比如你這塊內存還沒別人用,那麼訪問就還是原來的值,或者變成0了;如果被別人用了,那什麼都會發生,這種就是所謂的野指針。所以你這裡share_ptr和delete的行為不一樣也正常,你可以運行多次看看結果如何。
方案2的a是在堆上分配的,方案3是在堆疊上分配的,delete只能用來釋放堆上的記憶體(或者說new出來的記憶體),不能釋放堆疊上的,所以會報_BLOCK_TYPE_IS_VALID的錯誤。堆疊上內存在函數退出時由系統自動釋放