C++智能指针是一种特殊的指针类,它可以自动管理内存并避免常见的内存问题,比如内存泄漏和悬空指针。C++11引入了两种主要的智能指针:std::unique_ptr和std::shared_ptr。
std::unique_ptr
std::unique_ptr是一个独占式智能指针,它拥有对动态分配内存的唯一所有权,即同一时间内只能有一个std::unique_ptr对象指向该内存。当该对象被销毁时,它会自动释放所管理的内存。
使用std::unique_ptr时,我们需要将new表达式返回的原始指针传递给std::unique_ptr的构造函数,例如:
c
std::unique_ptr ptr(new int(42));
在上面的例子中,我们通过new表达式创建了一个int类型的对象,并将其地址传递给std::unique_ptr的构造函数。由于ptr是std::unique_ptr类型的对象,因此它会在离开作用域时自动释放该内存,从而避免了内存泄漏。
需要注意的是,std::unique_ptr不支持复制和赋值操作,因为这可能会导致多个智能指针对象同时拥有同一块内存所有权,进而导致程序的错误行为。如果需要共享所有权,应该使用std::shared_ptr。
std::shared_ptr
std::shared_ptr是一个共享式智能指针,多个std::shared_ptr对象可以共同拥有对同一块内存的所有权。它使用引用计数来跟踪内存的使用情况,即记录当前有多少个std::shared_ptr对象引用了该内存块。当最后一个引用该内存块的std::shared_ptr对象被销毁时,它会自动释放所管理的内存。
使用std::shared_ptr时,我们同样需要将new表达式返回的原始指针传递给std::shared_ptr的构造函数,例如:
c
std::shared_ptr ptr(new int(42));
在上面的例子中,我们创建了一个int类型的对象,并将其地址传递给std::shared_ptr的构造函数。此时,ptr和其他引用相同内存块的std::shared_ptr对象都会增加该内存块的引用计数。当最后一个std::shared_ptr对象被销毁时,它会自动释放所管理的内存。
需要注意的是,std::shared_ptr在处理循环引用问题时需要特别小心,因为两个std::shared_ptr对象可能相互引用,导致它们的引用计数永远不为0,从而导致内存泄漏。为了避免这种情况,我们可以使用std::weak_ptr来打破循环引用关系。
std::weak_ptr
std::weak_ptr是一个弱引用智能指针,它可以监视由std::shared_ptr的物理的内存块,但不会增加该内存块的引用计数。当最后一个引用该内存块的std::shared_ptr对象被销毁时,std::weak_ptr也会失效。
使用std::weak_ptr时,我们需要通过std::shared_ptr对象的weak_ptr()方法来创建一个std::weak_ptr对象,例如:
c
std::shared_ptr ptr(new int(42));
std::weak_ptr weakPtr = ptr;
在上面的例子中,我们首先创建了一个std::shared_ptr对象ptr,然后通过ptr的weak_ptr()方法创建了一个std::weak_ptr对象weakPtr。此时,weakPtr和ptr都指向同一块内存,但它们的引用计数不同。当最后一个引用该内存块的std::shared_ptr
另外还有Auto_ptr但已经过时所以不做介绍