智能指针的最主要作用还是自动释放资源,常用3种智能指针:unique_ptr, shared_ptr, weak_ptr
1. auto_ptr
c++98中提供了一种指针容器auto_ptr,基本已弃用,具有如下几个特性:
(1)无引用计数
(2)不能指向数组
(3)不能放入容器中使用
2. unique_ptr
特性:
- unique_ptr独享所有权,意味着:unique_ptr对象始终是关联的原始指针的唯一所有者。我们无法复制unique_ptr对象,它只能移动。由于每个unique_ptr对象都是原始指针的唯一所有者,因此在其析构函数中它直接删除关联的指针,不需要任何参考计数。
- unique_ptr的资源通常可以自动释放,c++14标准后,用户也可以自定义delete方法,这会增加内存的占用量
- 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大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/334482
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!