c++ 智能指针 unique_ptr

使用指针时很容易出现内存泄漏,便引入了智能指针,c++ 11中主要有三类

  • std::unique_ptr:独占资源指针,同一时刻只能有一个指针指向同一个对象
  • std::shared_ptr:共享资源指针,同一时刻可以有多个指针指向同一个对象
  • std::weak_ptr:用来解决shared_ptr相互引用导致的死锁问题
  • auto_ptr:已经废弃

unique_ptr

头文件 #include <memcpy>
使用std::unique_ptr代替裸指针,在离开作用域时自动释放内存
std::unique_ptr的引用计数始终为1,其性能与裸指针几乎等同

初始化

unique_ptr是没有拷贝构造函数的,只支持右值拷贝构造
这里的右值拷贝构造只能使用new或者同为智能指针的对象

// 直接初始化
std::unique_ptr<int> ptr(new int(3));

// make_unqiue 
// 注:该方法是c++ 14才有的
std::unique_ptr<int> ptr = std::make_unique<int>(3);

// std::move 
// 移动语义初始化(实际上移动语义和匿名对象初始化最终都是调用右值拷贝构造函数)
std::unique_ptr<int> ptr1(new int(1));
std::unique_ptr<int> ptr2 = std::move(ptr1);

// 还有一种错误初始化方式
std::unique_ptr<int> ptr1(new int(1));
std::unique_ptr<int> ptr2 = ptr1;  // 报错,尝试应用已删除的函数
std::unique_ptr<int> ptr3(ptr1);	// 报错,左值拷贝构造并未实现

成员函数

  1. release()
    释放,调用后智能指针和其所指向对象的联系再无联系,但是该内存仍然存在有效。它会返回裸指针,但是该智能指针被置空
    返回的裸指针我们可以手工delete来释放,也可以用来初始化另外一个智能指针,或者给另外一个智能指针赋值。

    std::unqiue_ptr<int> ptr1 = std::make_unique<int>(1);
    std::unique_ptr<int> ptr2(ptr1.release());	// 此时,ptr1 = nullptr
    
  2. reset()
    reset()不带参数情况:释放智能指针所指向的对象(释放因为它是独占,而不像shared_ptr还需要考虑引用计数),并将智能指针置空。
    reset()带参数时:释放智能指针所指向的对象,并将该智能指针指向新对象.

  3. get()
    返回智能指针中保存的裸指针
    返回值裸指针与智能指针共同管理对象

  4. swap()
    交换两个对象的指向

    unique_ptr<string> ps1(new string("good luck"));
    unique_ptr<string> ps2(new string("good luck2"));
    ps1.swap(ps2);
    std::swap(ps1, ps2);//也可使用标准库的swap
    

置空

  1. release和reset均可以置空
  2. nullptr也可以置空
    class A
    {
    public:
        A()
        {
            std::cout << "init" << std::endl;
        }
        ~A()
        {
            std::cout << "~A" << std::endl;
        }
    };
    
    std::unique_ptr<A> ptra = std::make_unique<A>();
    ptra = nullptr;
    
    // out
    // init
    // ~A
    

unique_ptr转shared_ptr

使用std::move即可

	std::unique_ptr<int> ptr(new int(6));
	std::shared_ptr<int> sharedPtr = std::move(ptr);
	// 当转移所有权后ptr指向为null
经验之谈
  1. 若形参为unique_ptr,需要引用。因为值传递相当于拷贝一份,而unique_ptr不支持拷贝,会提示已经删除的函数
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值