关于shared_ptr 的一些探索

很多年没有做过C++项目了,最近买了中文版的STL标准模板库第二版,准备花些时间了解一下C++11的最新内容。完整的阅读了Smart Pointer的内容之后,想写几个例子熟悉一下Shared_ptr的使用方法。在这个过程中,遇到了一些问题,于是便把它们记录了下来,以便大家一起探讨。

 

1,使用Shared_ptr动态分配数组,并访问。

起初感觉用Lamda表达式来提供deleter很有意思,并且这种表达式和C#中的有很大的区别。于是,迫不及待的想试试这个语法。但很快便陷入了僵局,怎么搞也无法访问数组。很多网友说这种情况是应该使用shared_array来处理。对于这种说法我不是很同意,既然是Smart Pointer ,就应该支持Pointer的所有功能才能说得通。查阅了一下MSDN,很快的解决了这个问题。


请注意get() method: The member function returns the address of the owned resource.也就是说,pInt.get()的返回值类似于raw pointer的首地址,于是便可以用[]对该动态数组操作。


2强转换Shared_ptr**,传入函数

有些时候,当函数的返回值另有他用,我们通常会考虑通过函数的参数得到某些想要的信息。在这种情况下,这个函数会需要一个**的参数,在函数体内这个实参会被实例化,并且代会所需要的信息。

 

基于上一个例子,假设存在一个既有的一个函数,其中某一个参数便是**类型。我尝试用Shared_ptr类型的变量当做实参传入。


运行过程中,程序异常终止。此时,我推断应该是空引用,导致了异常。如果这个推断是对的,那么get()函数只是返回了RawPointer的地址,而并非Raw Pointer的引用,pTemp也只是指向了这个地址。之后,给pTemp重新赋值只是改变了pTemp的指向地址。

 

接下来,这个例子说明了上面的推断是正确的。




通过这个例子,更好的了解了Shared_ptr,我们不应该通过get()函数取得Raw Pointer的地址,然后再操作这个地址。类似,get()函数返回后,调用delete来释放,那么Shared_ptr将会异常。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值