C++11智能指针

使用new和delete来管理内存,容易出现问题,比如忘记delete、程序异常or过早返回导致没有运行delete之类的。智能指针的使用方式跟常规指针一样,最大的区别是它会自动释放所指向的对象。因为智能指针是一个类,当这个对象的生命周期结束时会执行析构函数,那么只要在析构函数中delete 指针就可以自动完成内存的回收。

主要有两个指针:shared_ptr允许多个指针指向同一个对象,unique_ptr则“独占”所指向的对象。

shared_ptr

创建智能指针(为空):

shared_ptr<string> p1;
shared_ptr<list<int>> p2;

shared_ptr和new结合使用:

shared_ptr<int> p2(new int(1024));//初始化

shared_ptr的复制和赋值:当进行复制和赋值时,每个shared_ptr都会记录有多少个其他shared_ptr指向这个相同的对象。

auto p = make_shared<int>(42); //auto用于变量的自动类型推断。
auto q(p);

每个shared_ptr都有一个引用计数器,复制一个shared_ptr时,计数器递增。给shared_ptr赋予一个新值或是shared_ptr被销毁(例如一个局部的shared_ptr离开其作用域)时,计数器递减。一旦最后一个shared_ptr需要被销毁,而且计数器变为0时,它就会调用shared_ptr类的析构函数销毁对象,并释放它所指向的内存空间。

unique_ptr

unique_ptr大致跟shared_ptr相同,不同的是某个时刻只能有一个unique_ptr指向一个给定对象。

智能指针原本还有一个auto_ptr,但是缺陷很多,已经被unique_ptr取代。

weak_ptr

weak_ptr主要用来解决share_ptr的循环引用问题,参考智能指针与循环引用

在这里插入图片描述
class B; // 前置声明
class A {
public:
	shared_ptr<B> ptr;
};

class B {
public:
		shared_ptr<A> ptr;
};

int main()
{
     while(true) {
         shared_ptr<A> pa(new A());
         shared_ptr<B> pb(new B());
         pa -> ptr = pb;
         pb -> ptr = pa;
     }
     return 0;
} 

将一个 weak_ptr 绑定到一个 shared_ptr,不会改变 shared_ptr 的引用计数。即使有 weak_ptr 指向对象,一旦最后一个指向对象的 shared_ptr 被销毁,对象就会被释放。因此weak_ptr不能直接访问对象,要先调用lock函数判断对象是否仍然存在,如果存在,会返回一个指向共享对象的 shared_ptr,然后再用这个share_ptr访问对象。

if ( shared_ptr<int> np = wp.lock() ) // 如果 np 不为空则条件成立
{ 
    // 在if中,np与p共享对象
}

参考[C++11新特性] 智能指针详解

### C++11智能指针的用法和特性 #### 使用场景与优势 C++11引入了三种主要类型的智能指针:`std::unique_ptr`, `std::shared_ptr` 和 `std::weak_ptr`。这些智能指针通过自动管理对象生命周期来提高程序安全性并减少内存泄漏的风险[^1]。 #### unique_ptr 的定义与使用方法 `std::unique_ptr` 是一种独占所有权的智能指针,意味着同一时间只有一个 `unique_ptr` 可以指向某个特定的对象实例。当 `unique_ptr` 被销毁时,它所拥有的资源也会被释放。 ```cpp #include <memory> // 创建一个指向整数的唯一指针 std::unique_ptr<int> p(new int(42)); ``` #### shared_ptr 的定义与使用方法 对于需要多个所有者共享同一个对象的情况,则可以使用 `std::shared_ptr`. 它内部实现了一个引用计数机制,每当有一个新的 `shared_ptr` 复制该指针时就会增加计数值;而当最后一个持有此指针的对象超出作用域或显式删除时才会真正释放关联的堆分配空间. ```cpp #include <memory> void foo(std::shared_ptr<int> sp){ *sp += 5; } int main(){ auto ptr = std::make_shared<int>(10); foo(ptr); // 不会触发深拷贝,因为只是传递给函数参数 } ``` #### weak_ptr 的定义与使用方法 为了避免循环引用问题,在某些情况下还需要配合 `std::weak_ptr` 来观察而不控制目标对象的生命期。这通常发生在两个对象相互保持对方存活的情况下(即A持有了B,B也持有了A),此时如果都采用强引用(`shared_ptr`)则会造成无法回收的问题. ```cpp class Node { public: ~Node() { /* ... */ } private: std::vector<std::weak_ptr<Node>> neighbors_; // 邻居节点列表只做观测用途 }; ``` 以上就是关于C++11智能指针的主要介绍以及它们各自的特性和应用场景.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值