智能指针就是为了方便释放堆内存和解决各种需要程序员注意的细节而出现的,智能指针不强制程序员手动释放堆内存。当智能指针离开作用域时,智能指针会自动释放它指向的堆内存。这篇教程将讲解如何简单地使用智能指针。

类std::unique_ptr是独占指针的类型,独占指针是智能指针的一种,它在memory标准库中。

以下是创建默认的独占指针pointer,用来保存int类型的内存地址。默认创建的独占指针会被初始化为指针空值nullptr:

以下这个函数是申请int类型的堆内存并且保存到一个独占指针中,然后返回这个独占指针:

以上就是创建独占指针的方法,而使用方法和普通的指针一样。

类std::unique_ptr声明的指针独占一份堆内存。也就是说,一份堆内存同一时间只能由一个独占指针保存它的地址,其他指针都不能通过赋值来保存这份堆内存的地址;如果想用其他独占指针保存这份堆内存,则只能通过转移来赋值。先看看一个简单的栗子:

类std::shared_ptr是共享指针的类型,共享指针是智能指针的一种,它在memory标准库中。

顾名思义,共享指针保存的内存地址可以共享给其他共享指针。由于它可以共享,为了保证它的安全性,共享指针自身所需内存也比独占指针要多一点,而内部会比独占指针多小小操作,所以性能会有小小下降。共享指针的额外消耗非常小,一般可以忽略;如果系统资源对这些损耗非常敏感,可以考虑尽量使用独占指针。

pointer2保存的地址是否等于pointer1保存的地址:true

转移后pointer1是否保存指针空值:true

共享指针的操作和独占指针的操作类似,使用函数std::make_shared申请内存并返回一个共享指针。而共享指针可以把它保存的地址共享给其他共享指针,独占指针则不行。