尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

记一次因对象构造顺序引发的踩内存问题

记一次因对象构造顺序引发的踩内存问题
📅 发布时间:2026/6/19 8:02:08

记一次因对象构造顺序引发的踩内存问题

背景与现象

template<typename T>
struct range_reader
{range_reader(const T &low_bound, const T &upper_bound): low_(low_bound), high_(upper_bound){}T operator()(const std::string &s){T ret = default_reader<T>()(s);if (!(ret >= low_ && ret <= high_))throw cmdline::cmdline_error(s + " out of range" + constraint());return ret;}const std::string &constraint(){msg_.clear(); // ERROR 这里崩溃msg_ = "[" + detail::lexical_cast<std::string>(low_) + ", " + detail::lexical_cast<std::string>(high_) + "]";return msg_;}private:const T low_, high_;std::string msg_;
};

如上述代码,代码中存在调用 range_reader<T>::constraint() 方法的地方。有一处对该方法的调用必然在第一次访问 msg_ 对象时引发崩溃,且根据崩溃信息确认错误是踩内存。

分析与解决

已经确认是踩内存,因此首先断点打到 msg_.clear() 这行,观察栈帧中的变量。发现无法读取 msg_ ,且同生命周期的 low_ 和 high_ 的值都是未定义的,说明当前的 range_reader 对象没有被初始化。

于是顺着栈帧网上找,发现调用 range_reader<T>::constraint() 方法是在这里:

template<typename T, typename R>
class option_with_value_with_reader : public option_with_value<T>
{
public:option_with_value_with_reader(const std::string &full_name, char short_name, const class description &desc,bool required, const T default_value,R value_reader): option_with_value<T>(full_name, short_name, full_description(desc), required, default_value), reader_(value_reader){}//...
private:class description full_description(const class description &desc){// NOTE 这里不能调用reader_,因为reader_尚未被初始化(该函数在构造函数中被调用)return cmdline::description(desc.brief() + " " + reader_.constraint(), desc.detail());}//...R reader_;
};

option_with_value_with_reader 的构造函数中调用了 full_description() ,其中又调用了 range_reader<T>::constraint() 。而在 option_with_value_with_reader 的初始化列表中,reader_ 的初始化放在了调用 full_description() 之后——即调用 full_description() 时 reader_ 对象尚未初始化。

由于继承关系中的构造函数调用顺序始终是先调用基类的构造函数再调用子类的,所以这里无法通过调整初始化列表中的顺序来解决。最终的解决方案是调整代码逻辑,不要在构造函数的初始化列表中使用当前类的直接成员(即使是基类继承而来的成员),而是改为在构造函数体中调用 full_description() 函数。

相关新闻

  • 恒流电路的震荡问题
  • Rust 的英文数字验证码识别系统设计与实现
  • IOS开发 - UIViewController 界面控制基类解析

最新新闻

  • 2026 年 6 月最新无锡同城购宠评分榜实测|7 家正规猫舍犬舍横向测评,附近实体门店避坑全攻略 - 吉林同城获客
  • 广州租办公室哪里好?万博德舜大厦A塔居首,2026年6月四大商务区深度横评 - 速递信息
  • 嵌入式GUI开发:emWin LISTVIEW控件从入门到精通
  • 2026深圳龙岗宝安龙华黄金回收实测 多轮对比实测优选 - 逸程
  • 2026上海钻石回收7家机构对比测评 本土标杆机构推荐 - 薛定谔的梨花猫
  • Flutter PullToRefresh与NestedScrollView集成深度解析:解决复杂滚动场景的终极指南

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号