关于智能指针shared_ptr的疑点,求高手解答

关于智能指针shared_ptr的疑问,急求高手解答!
今天在研究shared_ptr的时候遇到一个问题:
程序如下所示:

#include "stdafx.h"
#include <iostream>
#include <memory>

using namespace std;

class Point{
private:
int x,y;
public:
Point():x(0),y(0){};
Point(int a, int b):x(a),y(b){};
void Print(){
cout<< x <<" "<< y <<endl;
}
};

shared_ptr<Point> PtrReturn(){
shared_ptr<Point> ptr1(new Point(10, 10));
shared_ptr<Point> ptr2(ptr1);
return ptr2;
}

Point* NoPtrReturn(){
Point p(1, 1);
return &p;
}

int main()
{
shared_ptr<Point> sp1;
sp1 = PtrReturn();
cout<<sp1.use_count()<<endl;
sp1->Print();

return 0;
}

运行结果是:
1
10 10

问题:
1、经测试main中的sp1可以接收PtrReturn的返回值,那么函数PtrReturn为什么可以返回一个局部的shared_ptr对象,这个对象按道理说是在栈上分配的啊?
2、sp1.use)count()的结果为什么是1呢?如果PtrReturn能够返回对象的话那么这个值应该是3才对啊?
3、如果PtrReturn中能够返回对象的话,那么shared_ptr是如何释放new Point(10, 10)的内存的呢?难道不应该在PtrReturn函数结束的时候返回吗?

------解决方案--------------------
1. shared_ptr 对象是可以复制的,与在不在栈上无关。
2. 因为只有一个shared_ptr还存活着,其他的都析构了,管理权也释放了。
3. 直到main()函数结束,对象才被释放。建议:在Pointer析构函数中打印语句,便于理解。

另,仅限你这个应用场景而言,unique_ptr足够了。