1.不要使用auto_ptr。
scoped_ptr,auto_ptr都是表达唯一所有权持有者的,区别在于,scoped_ptr的所有权是从一而终的,auto_ptr则允许用户以很自然的方式转交资源。两者的设计理念都保证同一时刻所有权持有者唯一。
auto_ptr的好处是显而易见的。比如你在用vector保存智能指针时,由于大量元素操作必须涉及资源转移,scoped_ptr完全没法用。然而其设计上的最大问题在于让一切赋值行为变成了资源转交。这一点不符合最小惊讶原则,你很难一上来就接受原件被“拷贝”以后会失效这件事。所以C++11使用unique_ptr代替auto_ptr,除非在自身即将消亡的时候,资源的转交只能通过另一成员release显式完成。
auto_ptr最大的弊端在于允许很多几乎没有实际用处又不符合常规认知的行为,用scoped_ptr和unique_ptr可以利用静态检查早早地指出这些无意义操作的存在。
2.shared_ptr和weak_ptr可以解决野指针问题。
在多线程编程中有时会需要获取其他线程中的某个对象的状态,最直接的做法就是持有对象的指针,但却不能保证该对象的存活状态会造成访问野指针的情况。这种情况下可以使用shared_ptr或weak_ptr,前者持有指针指向的对象,可以保证对象一直存在,后者可以在需要是通过lock()临时持有对象,从而防止访问野指针的问题。需要注意的是如果两个对象都使用shared_ptr持有对方会造成相互引用导致析构问题。可以使用weak_ptr来防止对象相互持有造成的不自动析构。