C++程序输出随机符号问题求助:预期结果无法正常显示
问题分析与修复方案
核心问题:悬空引用引发的未定义行为
你的代码出现乱码的根本原因,是xml_node类中的node_name成员被定义为**std::string const&常量引用**,但构造函数接收的字符串参数很多时候是临时对象,临时对象销毁后,node_name就变成了悬空引用,访问它会触发未定义行为,直接表现为输出乱码。
比如创建value_node时:
make_xml_node<value_node<std::string>>("to",to)
第一个参数"to"是字符串字面量,会被隐式转换成临时std::string对象,xml_node的构造函数把node_name绑定到这个临时对象上,临时对象在构造完成后立即销毁,后续输出时访问node_name就是在读取已经释放的内存,自然会出现乱码。
另外你怀疑的第90行for循环里的->运算符是完全正确的:c是std::shared_ptr<xml_node_base>类型,c->output(os)等价于(*c).output(os),是调用智能指针指向对象成员函数的标准写法,这部分代码没有问题。
修复步骤
把xml_node中的node_name从引用类型改为值类型,让它直接持有字符串副本,不再依赖外部对象的生命周期:
class xml_node: virtual public xml_node_base { private: std::string node_name; // 去掉const&,改为值存储 public: xml_node() = delete; // 拷贝构造版本 xml_node(std::string const& name) : node_name(name) { }; // 可选:添加移动构造版本优化性能 xml_node(std::string&& name) : node_name(std::move(name)) { }; protected: void do_output_open(std::ostream& os) const override { os << "<" << node_name << ">"; }; void do_output_close(std::ostream& os) const override { os << "</" << node_name << ">"; }; };
修复后效果
修复后运行代码,会输出完整的XML格式内容:
<notes><note><to>Joe</to><from>UPS</from><subject>Reminder</subject><message>Pick up your package!</message></note><priority>54.23</priority></notes>
如果想要得到你预期的无标签纯文本输出,需要额外修改xml_node的输出逻辑(比如让value_node跳过标签输出),但当前乱码问题已经彻底解决。
内容的提问来源于stack exchange,提问作者mariacat
相关产品推荐
相关产品推荐

