C++的智能指针分为unique_ptr,shared_ptr。
先学习一下简单的那个unique_ptr。
unique_ptr封装了一个真实的指针,好处就在于unique_ptr退出作用域的时候,会把自己的指针给释放了(delete)。
这边没有调用delete,但是这个int的指针是能够被释放的。
自己写一个类,添加一个destructor,这样能看得更清楚点。
那我们自己delete不就可以了吗?何必使用unique_ptr呢?
如果代码只有一个出口,delete释放空间当然没有问题的,假设代码有多个退出口,那就要在多个地方添加delete,更可怕的是exception,如果有异常抛出,你需要try/catch之后才能调用delete释放空间。而使用unique_ptr就没有这个问题。
这里没有使用unique_ptr,正常调用,没有问题,destructor会被调用,确实释放了空间。
添加一个exception,可以看到对象就没有机会释放了。
当然只要try/catch一下,就没什么问题了。
使用unique_ptr就没有问题了。这边比较有点不是很公平,我在test()外面还是套了try/catch。这是因为throw的异常如果没有任何地方catch的话,整个程序就crash了。所以destructor还是可能调用不到。
好了,问题来了。那为什么还要在这里使用指针呢?直接把对象放在stack上不就行了吗?
确实在这个例子里面根本没有必要使用指针。但是如果你的指针内容有可能需要多次变化的呢?比如下面的情况。
当然还有其他情况,也可能会用到。感觉shared_ptr可能使用环境会更多点。