Effective Modern C++: 智能指针(一)

智能指针的最主要作用还是自动释放资源,常用3种智能指针:unique_ptr, shared_ptr, weak_ptr

 

1.  auto_ptr

c++98中提供了一种指针容器auto_ptr,基本已弃用,具有如下几个特性:

(1)无引用计数

(2)不能指向数组

(3)不能放入容器中使用

 

2.  unique_ptr

特性:

  1. unique_ptr独享所有权,意味着:unique_ptr对象始终是关联的原始指针的唯一所有者。我们无法复制unique_ptr对象,它只能移动。由于每个unique_ptr对象都是原始指针的唯一所有者,因此在其析构函数中它直接删除关联的指针,不需要任何参考计数。
  2. unique_ptr的资源通常可以自动释放,c++14标准后,用户也可以自定义delete方法,这会增加内存的占用量
  3. unique_ptr成员函数:
成员函数 作用
reset() 重置unique_ptr为空,delete其关联的指针。
release() 不delete关联指针,并返回关联指针。释放关联指针的所有权,unique_ptr为空。
get() 仅仅返回关联指针

unique_ptr一个典型的应用实例是用于工厂模式中,下面给出一个例子:

 1 class Money{
 2 
 3 };
 4 
 5 class Dollar: public Money{
 6 
 7 };
 8 
 9 class RMB: public Money{
10 
11 };
12 
13 class Euro: public Money{
14 
15 };
16 
17 std::unique_ptr<Money> getMoney(std::string countryName){
18     std::unique_ptr<Money> pMoney(nullptr);
19     if (countryName == "China"){
20         pMoney.reset(new RMB());
21     } else if (countryName == "USA"){
22         pMoney.reset(new Dollar());
23     } else if (countryName == "Italy"){
24         pMoney.reset(new Euro());
25     }
26     return pMoney;
27 }

std::unique_ptr第二个模板参数是delete方法,在C++14标准中,推荐使用lambda方法作为参数,可以有效减少内存占用,给出一个例子:

 1 class Money{
 2 
 3 };
 4 
 5 class Dollar: public Money{
 6 
 7 };
 8 
 9 class RMB: public Money{
10 
11 };
12 
13 class Euro: public Money{
14 
15 };
16 
17 auto declMoney1 = [](Money* money){
18     std::cout << "Delete" << std::endl;
19     delete money;
20 };
21 
22 using unique_money_ptr = std::unique_ptr<Money, decltype (declMoney1)>;
23 
24 unique_money_ptr getMoney(std::string countryName){
25     unique_money_ptr pMoney(nullptr, declMoney1);
26     if (countryName == "China"){
27         pMoney.reset(new RMB());
28     } else if (countryName == "USA"){
29         pMoney.reset(new Dollar());
30     } else if (countryName == "Italy"){
31         pMoney.reset(new Euro());
32     }
33     return pMoney;
34 }

只需一次赋值,unique_ptr便可以比较简单地转换为shared_ptr:

1 std::shared_ptr<Money> p2 = getMoney("USA");

 

原文链接: https://www.cnblogs.com/Asp1rant/p/12458424.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    Effective Modern C++: 智能指针(一)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/334482

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午9:41
下一篇 2023年3月1日 下午9:41

相关推荐