shared_ptr使用的有关问题

shared_ptr使用的问题
先贴出代码和运行结果:

#include <iostream>
#include <memory>

using namespace std;

int main()
{
shared_ptr<int> p(new int(2000));
int* q = p.get();
{
shared_ptr<int>(q);
}
int foo = *p;
cout << foo << endl;

/*
ENVIRONMENT:
VS2012(32bit) | g++-4.8(32bit)

OUTPUT:
2000
*/

return 0;
}


我用VS2012和g++编译运行都是输出2000。
按说shared_ptr<int>(q);所在块结束后shared_ptr会删除q指向的对象。为啥int foo = *p;还能取到原来的值?
------解决方案--------------------
shared_ptr<int>(q);
改为:
shared_ptr<int>::shared_ptr<int>(q);
shared_ptr<int>((int *)q);
shared_ptr<int>((int **)q);
都可以暴露问题,唯独
shared_ptr<int>(q);
没有问题

------解决方案--------------------
问题的本质在于shared_ptr<int>(q);一句并没有调用shared_ptr<int>(int *)这个构造函数,而是调用的shared_ptr<int>()这个构造函数,并未对q造成任何影响。而我提出的其他写法包括(shared_ptr<int>)q这种写法都会调用其他构造函数,从而析构掉q造成下边的不正常。

至于为什么会调用不带参数的构造函数,我也不明白。难道是当成了强制转换??
------解决方案--------------------
引用
按说shared_ptr<int>(q);所在块结束后shared_ptr会删除q指向的对象

引用计数啊。 
------解决方案--------------------
引用:
Quote: 引用:

delete 一块内存。是指程序不再拥有这块内存而已。但这块内存还是存在的啊。同时这块内存上的数据还保留着。所以能输出2000


请问有文献能证明你的说法么?我觉得内存的数据应该是清除的吧。

我没有文献能证明我的说法。不过,有两个佐证。
一:Windows文件系统中,删除一个文件,并不会清楚磁盘上的数据,只是删除文件索引。很多恢复工具就是利用这个原理恢复被删的数据的。当年摄影爱好者陈老师也是不懂这个,才这么吃亏。
二:如果每delete一块内存,都要清除的话,太耗时了,不值得这么做。
------解决方案--------------------
shared_ptr<int>(q)有什么作用啊?q产生了什么变化?