设计原理:将基本类型指针封装为类对象指针(这个类肯定是个模板,以适应不同基本类型的需求),并在析构函数里编写delete语句删除指针指向的内存空间。
auto_ptr
则C++会把m_example所指向的内存回收,使m_example1 的值为NULL,所以在C++中,应绝对避免把auto_ptr放到容器中。即应避免下列代码:
vector<auto_ptr<MyClass>>m_example;
当对容器操作的时候,赋值传递会使容器中多个元素被置为NULL,而这不是我们想看到的。
unique_ptr
避免了指针指向有效数据的问题,会出现编译错误提示,即:
unique_ptr<string> pu1(newstring ("hello world"));
unique_ptr<string> pu2;
pu2 = pu1; // not allowed
unique_ptr<string>pu3;
pu3= unique_ptr<string>(new string("Yo!")); //allowed
将一个unique_ptr赋给另一个时,如果源unique_ptr是个临时右值,编译器允许这样做;如果源unique_ptr将存在一段时间,编译器将禁止这样做
还可以用std::move()将一个unique_ptr赋给另一个
unique_ptr<string> ps1, ps2;
ps1 = demo("hello");
ps2 = move(ps1);
ps1 = demo("alexia");
cout << *ps2 << *ps1 << endl;
另外, 可将unique_ptr存储到STL容器,只要不调用将一个unique_ptr复制或赋给另一个的相关算法(如sort())
Shared_ptr和auto_ptr最大的区别就是,shared_ptr解决了指针间共享对象所有权的问题,也就是auto_ptr中的赋值的奇怪问题。所以满足了容器的要求,可以用于容器中。