1、scoped_ptr
基本功能类似auto_ptr。首先确保任何时候对象都能被正确的删除。且 scoped_ptr所有权不能转让,一旦获取,无法从它那里取回。
//scoped_ptr 不能作为容器的元素,不允许不支持拷贝和赋值,因为拷贝和赋值函数是私有的。
//即,不存在 sp1 = sp2 这样的操作。
scoped_ptr<string> sp(new string("test"));
std::cout << *sp << std::endl;
std::cout << sp->size() << std::endl;
//sp is smart_ptr, not use delete for it.
成员函数reset()功能是重置scoped_ptr,删除原来保存的指针,在保存新的指针值。
2、scoped_array
//构造函数接受的指针必须是new[]的结果 不是new()的结果。没有*, ->操作符的重载
//析构函数必须是delete[] 释放, 不是delete
//重载operator[],像数组一样的用下标访问元素
scoped_array<int> sa(new int[100]);
std::fill_n(&sa[0], 100, 5);
sa[10] = sa[20] + sa[30];
sa[0] = 10;
// *(sa + 1) = 20; //错误的用法,因为重载operator[], 不支持数组首地址+N的方式访问数组元素
3、shared_ptr
//shared_ptr 是线程安全的, 一个shared_ptr可以被多个线程安全读取
shared_ptr<int> spi(new int(10));
shared_ptr<string> sps(new string("smart"));
typedef vector<shared_ptr<int>> vs; //一个持有shared_ptr的标准容器
vs v(10); //声明一个10元素的容器, 初始化为空指针
int i = 0;
for (auto iter = v.begin(); iter != v.end(); ++ iter)
{
(*iter) = make_shared<int>(i++); //应该试用工厂函数来消除对new的大量使用, 可接受10多个参数,参数将传递给类型T的构造函数,创建一个shared_ptr<T>对象并返回
std::cout << *(*iter) << ",";
}
std::cout << std::endl;
//eg;
shared_ptr<std::string> spFac = make_shared<std::string>("make_shared");
shared_ptr<vector<string, int>> spVec = make_shared<vector<string, int>>("string", 10);
/*有两种方法将shared_ptr用于容器
1、 将容器作为shared_ptr的管理对象, 如shared_ptr<List<T>>,使容器可以被安全的共享,用法与普通shared_ptr相同。 如 shared_ptr<int> pp = v[9];
2、 将shared_ptr作为容器的元素,如vector<shared_ptr<int>>
*/
shared_ptr<void *>(); //shared_ptr可以存储void*类型指针
4、shared_array
/构造函数接受的指针必须是new[]的结果 不是new()的结果。没有*, ->操作符的重载
//析构函数必须是delete[] 释放, 不是delete
//重载operator[],像数组一样的用下标访问元素
int * pI = new int[100];
shared_array<int> saa(pI);
shared_array<int> saa2 = saa;
saa[0] = 10; //shared_array 重载operator[]
assert(saa2[0] == 10);