c++ - 为什么delete后的指针不能解引用输出?而被智能指针的析构释放的指针可以解引用输出(尽管拿到的是垃圾数据)呢?
PHPz
PHPz 2017-04-17 14:29:14
0
1
649
    //方案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有什么区别?为什么错误不一样呢?

PHPz
PHPz

学习是最好的投资!

全部回覆(1)
左手右手慢动作
  1. shared_ptr預設也是呼叫delete,所以理論上和delete的機制沒什麼差別

  2. delete後再訪問的行為是不確定的,什麼情況都能發生,比如你這塊內存還沒別人用,那麼訪問就還是原來的值,或者變成0了;如果被別人用了,那什麼都會發生,這種就是所謂的野指針。所以你這裡share_ptr和delete的行為不一樣也正常,你可以運行多次看看結果如何。

  3. 方案2的a是在堆上分配的,方案3是在堆疊上分配的,delete只能用來釋放堆上的記憶體(或者說new出來的記憶體),不能釋放堆疊上的,所以會報_BLOCK_TYPE_IS_VALID的錯誤。堆疊上內存在函數退出時由系統自動釋放

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板