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离开程序块的时候,它应该被销毁,对应的内存也应该被释放了呀。 展开
#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离开程序块的时候,它应该被销毁,对应的内存也应该被释放了呀。 展开
展开全部
内存被释放是指内存的某块被标记为可用,但是其中具体数值是不会被擦除的。所有的指针都是这样的
追问
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;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询