#include "boost/scoped_ptr.hpp"
#include <iostream>
#include <memory>//contain auto_ptr
using namespace std;
using boost::scoped_ptr;
int main(int argc, char* argv[])
{
scoped_ptr<int > sp( new int(10) ) , sp2;
//sp = new int(10)
//error,因为拷贝构造函数和赋值构造函数都是私有的
//
cout<< *sp<<endl;
//sp2=sp; //error
int *p=sp.get(); //不会导致sp失去空间的占有权
//delete p ;//将导致错误,因为sp是分配的空间的所有者,只有它才有权利进行释放
*p = 20;
cout<< *sp<<endl;
auto_ptr<int> ap(new int(1)) ,ap2;
//ap = new int(1); //error
ap2 = ap ; //ap将失去分配的空间的所有权
int *p2 = ap2.get();//不会导致ap2失去空间的占有权
*p2=100;
//delete p2 ;//将导致错误,因为ap2是分配的空间的所有者,只有它才有权利进行释放
return 0;
}
/
智能指针类其实包含有几个数据成员其中一个就是所有权标记,另外一个就是指向动态分配的空间的地址。
1.只有对这个动态分配的空间拥有所有权的指针或者智能指针对象才有权利去释放这个空间。
因为如果使用指针的话没有所有权保护,所以虽然原则上是拥有所有权的才能释放但是如果是使用指针 就没办法确定一个指针是否占有所有权。所以不建议这么做。
//所有权与使用权分离。有使用权不一定有所有权!
另外智能指针类可以通过构造函数的访问属性和参数特性来禁止某些操作或允许某些操作。比如把重载赋值为私有来禁止赋值,把拷贝构造函数设置为私有来禁止拷贝。
2.对于智能指针而言get操作智能取得动态分配的空间的地址。而不能使智能指针失去所有权。
3.一个动态分配的空间在只有一个所有权并且在某一个只能有一个所有者。但可以有多个使用者。
使用者可以对空间的内容进行赋值,但不允许进行释放操作。
auto_ptr代表的动态分配的空间的所有权是可以转移( 通过赋值)的。
scoped_ptr代表的动态分配的空间的所有权则不能转移(重载赋值为私有来禁止赋值,把拷贝构造函数设置为私有来禁止拷贝。)!