言简意赅,智能指针详细原理不做介绍,只记录关键点。
1,STL的 std::auto_ptr实际应用基本无意义。因为使用 std::auto_ptr 时,绝对不能使用“operator=”操作符,这一操作会夺取原对象的所有权,会造成原对象悬空。
void TestAutoPtr2()
{
std::auto_ptr<Simple> my_memory(new Simple(1));
if (my_memory.get())
{
std::auto_ptr<Simple> my_memory2; // 创建一个新的 my_memory2 对象
my_memory2 = my_memory; // 复制旧的 my_memory 给 my_memory2
my_memory2->PrintSomething(); // 输出信息,复制成功
my_memory->PrintSomething(); // 崩溃
}
}
最终如上代码导致崩溃,罪魁祸首是“my_memory2 = my_memory”,这行代码,my_memory2 完全夺取了 my_memory 的内存管理所有权,导致 my_memory 悬空,最后使用时导致崩溃。
2,boost::scoped_ptr相当于改进版的std::auto_ptr,无上述缺陷。
3,boost::sharsed_ptr是最完美的智能指针,使用引用计数原理。
4,boost::weak_ptr
首先 boost::weak_ptr 是专门为 boost::shared_ptr 而准备的。有时候,我们只关心能否使用对象,并不关心内部的引用计数。boost::weak_ptr 是 boost::shared_ptr 的观察者(Observer)对象,观察者意味着 boost::weak_ptr 只对 boost::shared_ptr 进行引用,而不改变其引用计数,当被观察的 boost::shared_ptr 失效后,相应的 boost::weak_ptr 也相应失效。
boost::weak_ptr 主要用在软件架构设计中,可以在基类(此处的基类并非抽象基类,而是指继承于抽象基类的虚基类)中定义一个 boost::weak_ptr,用于指向子类的boost::shared_ptr,这样基类仅仅观察自己的 boost::weak_ptr 是否为空就知道子类有没对自己赋值了,而不用影响子类 boost::shared_ptr 的引用计数,用以降低复杂度,更好的管理对象。
其它库中常用智能指针,比如qt,c++ 11标准中的sharsed_ptr,原理基本等同于boost::weak_ptr 。