delete释放字符串指针_C++智能指针unique_ptr

C++的智能指针分为unique_ptr,shared_ptr。

先学习一下简单的那个unique_ptr。

unique_ptr封装了一个真实的指针,好处就在于unique_ptr退出作用域的时候,会把自己的指针给释放了(delete)。

748c726a428fc91470bd1f35621bda79.png

这边没有调用delete,但是这个int的指针是能够被释放的。

自己写一个类,添加一个destructor,这样能看得更清楚点。

c797edd2f01cf0a1d5ca0dbd1cebf20f.png

那我们自己delete不就可以了吗?何必使用unique_ptr呢?

如果代码只有一个出口,delete释放空间当然没有问题的,假设代码有多个退出口,那就要在多个地方添加delete,更可怕的是exception,如果有异常抛出,你需要try/catch之后才能调用delete释放空间。而使用unique_ptr就没有这个问题。

这里没有使用unique_ptr,正常调用,没有问题,destructor会被调用,确实释放了空间。

909f5f7f6b19fc39e40427c07d24f592.png

添加一个exception,可以看到对象就没有机会释放了。

3b446605d073aa63b85092455e874d76.png

当然只要try/catch一下,就没什么问题了。

c131b8663f315a36b16a658bce723aab.png

使用unique_ptr就没有问题了。这边比较有点不是很公平,我在test()外面还是套了try/catch。这是因为throw的异常如果没有任何地方catch的话,整个程序就crash了。所以destructor还是可能调用不到。

86153021d759ebea878e54e250879ff9.png

好了,问题来了。那为什么还要在这里使用指针呢?直接把对象放在stack上不就行了吗?

确实在这个例子里面根本没有必要使用指针。但是如果你的指针内容有可能需要多次变化的呢?比如下面的情况。

acc64cb535d07387d73921901051cd83.png

当然还有其他情况,也可能会用到。感觉shared_ptr可能使用环境会更多点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值