찾다

 >  Q&A  >  본문

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

    //方案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有什么区别?为什么错误不一样呢?

PHPzPHPz2805일 전645

모든 응답(1)나는 대답할 것이다

  • ringa_lee

    ringa_lee2017-04-17 14:31:14

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

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

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

    회신하다
    0
  • 취소회신하다