Boost[1]:智能指针

本文详细介绍了C++中的智能指针概念,包括shared_ptr、weak_ptr、scoped_ptr、auto_ptr及其应用实例,以及enable_shared_from_this的使用场景。通过代码示例,展示了智能指针如何帮助解决内存管理和资源释放的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试环境:win7, vs2012

 如果未安装boost,请参考:http://blog.youkuaiyun.com/alex_my/article/details/17630685

 涉及智能指针:shared_ptr, weak_ptr, scoped_ptr, auto_ptr

 其它:enable_shared_from_this

 总调用函数: testSmartPointer()

 可以将其放在main()中运行。解释在代码中。

  1. <span style="font-size:18px;">#include <string>  
  2. #include <vector>  
  3. #include <iostream>  
  4. #include <boost/scoped_ptr.hpp>  
  5. #include <boost/shared_ptr.hpp>  
  6. #include <boost/weak_ptr.hpp>  
  7. #include <boost/enable_shared_from_this.hpp>  
  8.   
  9. class Base  
  10. {  
  11. public:  
  12.     explicit Base(int a)  
  13.     : m_a(a)  
  14.     {  
  15.     }  
  16.     virtual ~Base()  
  17.     {  
  18.     }  
  19.   
  20.     int GetA() const  
  21.     {  
  22.         return m_a;   
  23.     }  
  24.   
  25. private:  
  26.     int m_a;  
  27. };  
  28.   
  29. class Derive : public Base  
  30. {  
  31. public:  
  32.     explicit Derive(int b)  
  33.         : Base(2 * b)  
  34.         , m_b(b)  
  35.     {  
  36.   
  37.     }  
  38.   
  39.     virtual ~Derive()  
  40.     {  
  41.     }  
  42.   
  43.     int GetB() const  
  44.     {  
  45.         return m_b;   
  46.     }  
  47.   
  48. private:  
  49.     int m_b;  
  50. };  
  51.   
  52. class EnableShared  
  53. {  
  54. public:  
  55.     EnableShared()  
  56.     : m_e(3)  
  57.     {  
  58.   
  59.     }  
  60.     ~EnableShared()   
  61.     {  
  62.         std::cout<< "EnableShared Destruction execute" << std::endl;  
  63.     }  
  64.   
  65.     void ShowE()  
  66.     {  
  67.         boost::shared_ptr<EnableShared> p1(this);  
  68.         std::cout<< p1->m_e << std::endl;  
  69.     }  
  70.   
  71. private:  
  72.     int m_e;  
  73. };  
  74.   
  75. class EnableSharedEx : public boost::enable_shared_from_this<EnableSharedEx>  
  76. {  
  77. public:  
  78.     EnableSharedEx()  
  79.         : m_e(3)  
  80.     {  
  81.   
  82.     }  
  83.     ~EnableSharedEx()   
  84.     {  
  85.         std::cout<< "EnableSharedEx Destruction execute" << std::endl;  
  86.     }  
  87.   
  88.     void ShowE()  
  89.     {  
  90.         //boost::shared_ptr<EnableSharedEx> p1(this);  
  91.         boost::shared_ptr<EnableSharedEx> p1 = shared_from_this();  
  92.         std::cout<< p1->m_e << std::endl;  
  93.     }  
  94.   
  95. private:  
  96.     int m_e;  
  97. };  
  98.   
  99. static void testSharedPtr();  
  100. static void testEnableSharedFromthis();  
  101. static void testScopedPtr();  
  102. static void testAutoPtr();  
  103.   
  104. void testSmartPointer()  
  105. {  
  106.     // ------------- shared_ptr -------------  
  107.     testSharedPtr();  
  108.   
  109.     // ------------- enable_shared_from_this -------------  
  110.     testEnableSharedFromthis();  
  111.   
  112.     // ------------- scoped_ptr -------------  
  113.     testScopedPtr();  
  114.   
  115.     // ------------- auto_ptr -------------  
  116.     testAutoPtr();  
  117.   
  118.     // ------------- summary -------------  
  119.     // 1 auto_ptr会转移所有权,使原拥有者失效  
  120.     // 2 shared_ptr比起auto_ptr,不会转移所有权,而是增加引用计数  
  121.     // 3 scoped_ptr不允许复制  
  122.     // 4 weak_ptr起了类似于观察者的作用,不会对拥有者造成影响  
  123. }  
  124.   
  125. void testSharedPtr()  
  126. {  
  127.     // 1 使用  
  128.     boost::shared_ptr<Base> pa(new Base(2));  
  129.     std::cout<< "testSharedPtr" << pa->GetA() << std::endl;  
  130.   
  131.     // 2 发生引用,此时pa2和pa指向同一个指针,观察计数器share_ptr::use_count_ 值从1变为2。  
  132.     boost::shared_ptr<Base> pa2 = pa;  
  133.   
  134.     // 3 弱引用,计数器并仍然是2,不过weak_count_ 从1变成了2。  
  135.     boost::weak_ptr<Base> p3 = pa;  
  136. }  
  137.   
  138. void testEnableSharedFromthis()  
  139. {  
  140.     // 1 应用举例  
  141.     boost::shared_ptr<EnableShared> pe(new EnableShared);  
  142.     //pe->ShowE();  
  143.   
  144.     // 2 注释说明  
  145.     // 编译可以通过,但是析构函数会执行两次,造成程序崩溃  
  146.     // shared_ptr的一个缺点,无法从this指针构造,无法像testSharedPtr中的引用例子一样。  
  147.   
  148.     // 3 解决办法 enable_shared_from_this,改写EnableShared为EnableSharedEx  
  149.     boost::shared_ptr<EnableSharedEx> pex(new EnableSharedEx);  
  150.     pex->ShowE();  
  151. }  
  152.   
  153. void testScopedPtr()  
  154. {  
  155.     // 1 应用举例、  
  156.     boost::scoped_ptr<Base> pb(new Base(2));  
  157.     std::cout << "testScopedPtr" << pb->GetA() << std::endl;  
  158.   
  159.     // 2 引用,无法通过编译,原因:scope_ptr不允许复制  
  160.     // boost::scoped_ptr<Base> pb2 = pb;  
  161. }  
  162.   
  163. void testAutoPtr()  
  164. {  
  165.     // 1 应用举例,与shared_ptr相似  
  166.     std::auto_ptr<Base> pa(new Base(2));  
  167.     std::cout<< "testAutoPtr: " << pa->GetA() << std::endl;  
  168.   
  169.     // 2 发生引用,与shared_ptr不同的地方在于pa编程空指针了。  
  170.     std::auto_ptr<Base> pax = pa;  
  171. }</span>  

不懂它的时候,你觉的它是洪水猛兽。了解它的时候,会觉得它是那么的亲切。
1. 用户与身体信息管理模块 用户信息管理: 注册登录:支持手机号 / 邮箱注册,密码加密存储,提供第三方快捷登录(模拟) 个人资料:记录基本信息(姓名、年龄、性别、身高、体重、职业) 健康目标:用户设置目标(如 “减重 5kg”“增肌”“维持健康”)及期望周期 身体状态跟踪: 体重记录:定期录入体重数据,生成体重变化曲线(折线图) 身体指标:记录 BMI(自动计算)、体脂率(可选)、基础代谢率(根据身高体重估算) 健康状况:用户可填写特殊情况(如糖尿病、过敏食物、素食偏好),系统据此调整推荐 2. 膳食记录与食物数据库模块 食物数据库: 基础信息:包含常见食物(如米饭、鸡蛋、牛肉)的名称、类别(主食 / 肉类 / 蔬菜等)、每份重量 营养成分:记录每 100g 食物的热量(kcal)、蛋白质、脂肪、碳水化合物、维生素、矿物质含量 数据库维护:管理员可添加新食物、更新营养数据,支持按名称 / 类别检索 膳食记录功能: 快速记录:用户选择食物、输入食用量(克 / 份),系统自动计算摄入的营养成分 餐次分类:按早餐 / 午餐 / 晚餐 / 加餐分类记录,支持上传餐食照片(可选) 批量操作:提供常见套餐模板(如 “三明治 + 牛奶”),一键添加到记录 历史记录:按日期查看过往膳食记录,支持编辑 / 删除错误记录 3. 营养分析模块 每日营养摄入分析: 核心指标计算:统计当日摄入的总热量、蛋白质 / 脂肪 / 碳水化合物占比(按每日推荐量对比) 微量营养素分析:检查维生素(如维生素 C、钙、铁)的摄入是否达标 平衡评估:生成 “营养平衡度” 评分(0-100 分),指出摄入过剩或不足的营养素 趋势分析: 周 / 月营养趋势:用折线图展示近 7 天 / 30 天的热量、三大营养素摄入变化 对比分析:将实际摄入与推荐量对比(如 “蛋白质摄入仅达到推荐量的 70%”) 目标达成率:针对健
1. 用户管理模块 用户注册与认证: 注册:用户填写身份信息(姓名、身份证号、手机号)、设置登录密码(需符合复杂度要求),系统生成唯一客户号 登录:支持账号(客户号 / 手机号)+ 密码登录,提供验证码登录、忘记密码(通过手机验证码重置)功能 身份验证:注册后需完成实名认证(模拟上传身份证照片,系统标记认证状态) 个人信息管理: 基本信息:查看 / 修改联系地址、紧急联系人、邮箱等非核心信息(身份证号等关键信息不可修改) 安全设置:修改登录密码、设置交易密码(用于转账等敏感操作)、开启 / 关闭登录提醒 权限控制:普通用户仅能操作本人账户;管理员可管理用户信息、查看系统统计数据 2. 账户与资金管理模块 账户管理: 账户创建:用户可开通储蓄卡账户(默认 1 个主账户,支持最多 3 个子账户,如 “日常消费账户”“储蓄账户”) 账户查询:查看各账户余额、开户日期、状态(正常 / 冻结)、交易限额 账户操作:挂失 / 解挂账户、申请注销账户(需余额为 0) 资金操作: 转账汇款:支持同行转账(输入对方账户号 / 手机号),需验证交易密码,可添加常用收款人 存款 / 取款:模拟存款(输入金额增加余额)、取款(输入金额减少余额,需不超过可用余额) 交易记录:按时间、类型(转入 / 转出 / 存款 / 取款)查询明细,显示交易时间、金额、对方账户(脱敏显示)、交易状态 3. 账单与支付模块 账单管理: 月度账单:自动生成每月收支明细,统计总收入、总支出、余额变动 账单查询:按月份、交易类型筛选账单,支持导出为 Excel 格式 还款提醒:若有贷款(简化版可模拟),系统在还款日 3 天前发送提醒 快捷支付: 绑定支付方式:添加银行卡(系统内账户)作为支付渠道 模拟消费:支持输入商户名称和金额,完成支付(从账户余额扣减) 支付记录:保存所有消费记录,包含商户、时间、金额、支付状态 4.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值