总结:
auto_ptr 是 C98标准,在 C++11 后已被抛弃
unique_ptr 是 auto_ptr 的替代品,和 auto_ptr 一样,同一个对象只能由一个指针指向
shared_ptr 是最常用的智能指针,同一个对象可以有多个指针指向,其数量由引用计数来描述,当引用计数减为0时,会释放指向的内存
weak_ptr 专门为了解决 shared_ptr 循环引用问题而设的,具体见下文
auto_ptr:
auto_ptr是C++98标准中提供的智能指针,它的主要作用是管理动态分配的对象,并在对象不再需要时自动释放内存。然而,auto_ptr在实现上存在一些问题,因此在C++11标准中被废弃,并被unique_ptr取代。
auto_ptr与boost库中的shared_ptr不同之处在于引用计数的处理。auto_ptr没有考虑引用计数,因此一个对象只能由一个auto_ptr所拥有。当将一个auto_ptr赋值给另一个auto_ptr时,会转移这种拥有关系,即原来的auto_ptr将不再拥有该对象。
另外,auto_ptr不能指向数组。因为auto_ptr在析构的时候只是调用delete来释放内存,而数组应该要调用delete[]来释放内存。
总结起来,auto_ptr是一种简单的智能指针,但由于其存在的问题,已经被废弃。在实际开发中,建议使用更安全和更灵活的智能指针,如unique_ptr或shared_ptr。
unique_ptr:
unique_ptr是C++11中引入的智能指针,用于管理动态分配的对象。它是一种独占所有权的智能指针,意味着每个unique_ptr对象都是其所指向对象的唯一所有者。
以下是关于unique_ptr的介绍和示例:
创建一个空的unique_ptr对象:
std::unique_ptr<int> ptr1;
检查unique_ptr对象是否为空:
if (ptr1 == nullptr) { // unique_ptr对象为空 }
创建一个unique_ptr对象并关联一个动态分配的对象:
std::unique_ptr<int> ptr2(new int(42));
使用unique_ptr对象访问所指向的对象:
int value = *ptr2;
使用unique_ptr对象释放所指向的对象:
ptr2.reset(); // 释放所指向的对象
使用unique_ptr对象移动所有权:
std::unique_ptr<int> ptr3 = std::move(ptr2); // 移动ptr2的所有权给ptr3
请注意,unique_ptr对象在其析构函数中会自动删除关联的指针,因此不需要手动释放内存。