//[智能指针]操作测试
//######################################################################################################
//#【 unique_ptr 】
unique_ptr<string> unique_ptr__fn() {
//【 unique_ptr 】
// 是一个同一时间只能指向一个对象,并且不能被拷贝和赋值的智能指针
unique_ptr<string> a( new string( "test" ) ); //new出一个string 并使用'智能指针(a)'指向它
*a = "what? "; //修改指针a所指向的string的值
//unique_ptr<string> b( a ); //错误,不能被拷贝
//unique_ptr<string> c = a; //错误,不能被赋值
unique_ptr<string> d( a.release() ); //可以调用release()释放指针用以转交所有权, 注意:此时并不销毁指向的对象
cout << *d;
//d.reset(); //手动调用reset销毁指向的对象
//cout << *d; //错误,指向的对象已经被手动销毁
unique_ptr<string> e = move( d ); //unique_ptr 支持move() 说明unique_ptr中存在move构造
//so 也可以用来作为返回值
//cout << *d; //错误,指针d已经move到e
return e; //返回智能指针e
}
void test_unqiue_ptr() {
unique_ptr<string> f = unique_ptr__fn(); //此时f = move(e);
cout << *f;
}
//######################################################################################################
//#【 shared_ptr 】
void shared_ptr__fn( shared_ptr<string>& x) {
//【shared_ptr_test】
// 带有引用计数的智能指针,所以允许赋值与copy操作,仅当计数归0时才销毁指向的对象
// 所以这样看来 在不考虑效率的情况下 shared_ptr是可以代替unique_ptr的
// 但是对于一个不需要共享的资源来说,尽量使用unique_ptr
shared_ptr<string> a( x ); //copy构造 OK
cout << *a;
//shared_ptr<string> b = a; //copy构造 OK
//shared_ptr<string> c;
//c = b; //赋值操作 OK
return; //ret后局部指针a将失效,但是并不会销毁指向的对象
}
void shared_ptr_test() {
shared_ptr<string> x( new string( "test " ) ); //构造一个shared_ptr
shared_ptr__fn(x); //将指针x传入下个函数中
return; //ret后 对象将被销毁
}