C++11智能指针:unique_ptr使用简介

本文探讨了unique_ptr的独特之处,它是智能指针的一种,不允许复制和赋值,仅支持移动构造和移动赋值,确保内存所有权单一。文章介绍了其使用场景,以及为何选择unique_ptr而非auto_ptr。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道auto_ptr通过复制构造或者通过=赋值后,原来的auto_ptr对象就报废了.所有权转移到新的对象中去了.而通过shared_ptr可以让多个智能指针对象同时拥有某一块内存的访问权.但假如我们不希望多个内存块被多个智能指针对象共享,同时又不会像auto_ptr那样不知不觉的就让原来的auto_ptr对象失效,可咋整呢?

这个时候就要使用unique_ptr了,顾名思义嘛,unique是唯一的意思.说明它跟auto_ptr有点类似,就是同时只能有一个智能指针对象指向某块内存.但它还有些其他特性.

1.无法进行复制构造与赋值操作.比如auto_ptr ap(new int(88 );

auto_ptr one (ap) ; // ok
auto_ptr two = one; //ok
但unique_ptr不支持上述操作
unique_ptr ap(new int(88 );
unique_ptr one (ap) ; // 会出错
unique_ptr two = one; //会出错2.可以进行移动构造和移动赋值操作
就是像上面这样一般意义上的复制构造和赋值或出错.但在函数中作为返回值却可以用.
unique_ptr GetVal( ){
unique_ptr up(new int(88 );
return up;
}
unique_ptr uPtr = GetVal(); //ok
实际上上面的的操作有点类似于如下操作
unique_ptr up(new int(88 );
unique_ptr uPtr2 = std:move( up) ; //这里是显式的所有权转移. 把up所指的内存转给uPtr2了,而up不再拥有该内存.另外注意如果你使用vs2008是没有std:move这函数的.
//vs2010开始才有,是c++ 11标准出现的内容.3.可做为容器元素
我们知道auto_ptr不可做为容器元素.而unique_ptr也同样不能直接做为容器元素,但可以通过一点间接的手段
例如:
unique_ptr sp(new int(88) );
vector > vec;
vec.push_back(std::move(sp));
//vec.push_back( sp ); 这样不行,会报错的.
//cout<<*sp<<> <>

总结:从上面的例子可以看出,unique_ptr和auto_ptr真的非常类似.其实你可以这样简单的理解,auto_ptr是可以说你随便赋值,但赋值完了之后原来的对象就不知不觉的报废.搞得你莫名其妙.而unique就干脆不让你可以随便去复制,赋值.如果实在想传个值就哪里,显式的说明内存转移std:move一下.然后这样传值完了之后,之前的对象也同样报废了.只不过整个move你让明显的知道这样操作后会导致之前的unique_ptr对象失效.

为什么要用智能指针
智能指针的使用场景
怎么使用智能指针
可以用在哪些功能上面
比如你知道哪些智能指针?shared_ptr的设计原理是什么?如果让你自己设计一个智能指针,你如何完成?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值