c++ - 为什么delete后的指针不能解引用输出?而被智能指针的析构释放的指针可以解引用输出(尽管拿到的是垃圾数据)呢?
PHPz
PHPz 2017-04-17 14:29:14
0
1
651
    //方案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 を呼び出すため、理論的には削除メカニズムと違いはありません

  2. 削除後の再アクセスの動作は不確実です。たとえば、メモリが他の人によって使用されていない場合、アクセスは元の値を保持するか、または元の値になります。 0; 他の人が使用すると、何かが起こります。これはいわゆるワイルド ポインタです。したがって、ここでの share_ptr と delete の動作が異なるのは正常です。複数回実行して結果を確認できます。

  3. プラン 2 の A はヒープ上に割り当てられ、プラン 3 はスタック上に割り当てられます。削除はヒープ上のメモリ (または新規からのメモリ) を解放するためにのみ使用でき、メモリを解放することはできません。スタック上にあるため、_BLOCK_TYPE_IS_VALID エラーが報告されます。スタック上のメモリは、関数が終了するとシステムによって自動的に解放されます

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート