C++Primer 中关于智能指针的一个问题 5

#include<iostream>#include<memory>usingnamespacestd;intmain(){shared_ptr<int>p(newint... #include<iostream>
#include<memory>
using namespace std;
int main()
{
shared_ptr<int> p(new int(42));//引用计数为1
int *q = p.get();//正确;但使用q时要注意,不要让它管理的指针被释放
{//新程序块;
//未定义:两个独立的shared_ptr指向相同的内存
shared_ptr<int>(q);
} //程序块结束,q被销毁,它指向的内存被释放
int foo = *p;//未定义:p指向的内存已经被释放
cout << foo << endl;
return 0;
}
上面是书上的原话,但是我在vs2013中foo仍然能打印出来42,按照理解,在shared_ptr离开程序块的时候,它应该被销毁,对应的内存也应该被释放了呀。
展开
 我来答
百度网友9dd49a5
2015-02-14 · TA获得超过390个赞
知道小有建树答主
回答量:188
采纳率:0%
帮助的人:169万
展开全部
内存被释放是指内存的某块被标记为可用,但是其中具体数值是不会被擦除的。所有的指针都是这样的
追问
shared_ptr(q);离开程序块会调用析构函数,会先销毁对象,再释放内存的。
追答

销毁对象=释放该对象所占内存=撤销内存占用标记!=擦除数据

您可以尝试在创建一个结构体,用全局变量记录这个结构体的地址,然后销毁它,看看内存的值还存不存在:

#include <iostream>
using namespace std;

struct Data
{
int a;
Data():a(123){}
}*space;



void tes()
{
Data tmp;
tmp.a = 20;
space = &tmp;
//tes()结束, tmp被销毁, 即执行默认析构函数 tmp.~Data();
}

int main()
{
tes();
cout << space->a << endl;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式