Rumah > Soal Jawab > teks badan
//方案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有什么区别?为什么错误不一样呢?
ringa_lee2017-04-17 14:31:14
shared_ptr默认也是调用delete,所以理论上和delete的机制没什么区别
delete后再访问的行为是不确定的,什么情况都能发生,比如你这块内存还没别人用,那么访问就还是原来的值,或者变成0了;如果被别人用了,那什么都会发生,这种就是所谓的野指针。所以你这里share_ptr和delete的行为不一样也正常,你可以运行多次看看结果如何。
方案2的a是在堆上分配的,方案3是在栈上分配的,delete只能用来释放堆上的内存(或者说new出来的内存),不能释放栈上的,所以会报_BLOCK_TYPE_IS_VALID的错。栈上内存在函数退出时由系统自动释放