news 2026/7/31 8:46:49

现代C++工程实践:简单的IniParser3——改进我们的split

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
现代C++工程实践:简单的IniParser3——改进我们的split

目录

前言

下面这个改进对吗

关键问题: substr() 返回的是新的 std::string

第二版:问题是如何被修复的?

修复的核心点:使用原始 src 构造 string_view 作为根

1. substr() 变成了 "视图切片",不是 "创建副本"

2. 原始 src 在整个函数调用外都是稳定对象


前言

上一篇博客我们提到了说我们是要改进咱们的split的,传送门在下面:

  • CSDN:现代C++工程实践:简单的IniParser2:分解需求与编写split-CSDN博客

  • 知乎:现代C++工程实践:简单的IniParser2:分解需求与编写split - 老老老陈醋的文章 - 知乎

  • Github: Awesome-Embedded-Learning-Studio/Tutorial_cpp_SimpleIniParser: 这是我们C++工程化开始的旅程!手搓一个最简单的Ini分析器!This is the beginning of our journey in C++ engineering! Handcrafting the simplest INI parser!

笔者这里单独开了一个博客全面的介绍了std::string_view

  • 简说C++17新东西:string_view-CSDN博客

  • C++17: std::string_view 全攻略 - 老老老陈醋的文章 - 知乎

看这篇博客之前,单独看看string_view。

下面这个改进对吗

下面这个片段是笔者一开始写出来的,各位看官阅读一下:

std::vector<std::string_view> splits_v2( const std::string& src, const char ch) { ​ std::vector<std::string_view> results; ​ if (src.empty()) { return results; } ​ auto current_positions = src.find(ch, 0); const size_t str_sz = src.size(); size_t last_index = 0; ​ while (current_positions != std::string::npos) { results.emplace_back(src.substr(last_index, current_positions - last_index)); results.emplace_back(src.substr(current_positions, 1)); ​ last_index = current_positions + 1; current_positions = src.find(ch, current_positions + 1); } ​ results.emplace_back(src.substr(last_index)); return results; }

看出来问题了吗?

关键问题:substr()返回的是新的std::string

std::string::substr()不是返回视图,它是拷贝构造一个新的字符串

std::string substr(pos, count);

而函数返回的是:

std::vector<std::string_view>

意味着如下情况会发生:

  1. src.substr(...)创建了一个临时的 std::string 对象

  2. string_view绑定到临时对象的内部buffer

  3. 临时对象生命周期仅存活到当前表达式结束

  4. string_view中的ptr立即悬空(dangling pointer)

  5. 返回后访问 view →UB(未定义行为)直接爆炸

也就是说,这个函数看起来运行正常,但返回的数据其实全部悬空。所以笔者在Release模式下就惊喜的发现了一堆bug:包括随机数据和直接悬空的问题

这是一种非常常见的 “临时对象挂掉,string_view 变尸体” 的经典错误。


第二版:问题是如何被修复的?

来看修复后的版本:

std::vector<std::string_view> splits_v2_fixed( const std::string& src, const char ch) { ​ std::vector<std::string_view> results; if (src.empty()) { return results; } ​ std::string_view src_view(src); // ⭐ 关键修复点:构造一个稳定的 view ​ const size_t delim_count = std::count(src.begin(), src.end(), ch); results.reserve(delim_count * 2 + 1); ​ size_t last_index = 0; size_t current_positions = src.find(ch, last_index); ​ while (current_positions != std::string::npos) { ​ results.emplace_back( src_view.substr(last_index, current_positions - last_index)); ​ results.emplace_back( src_view.substr(current_positions, 1)); ​ last_index = current_positions + 1; current_positions = src.find(ch, last_index); } ​ results.emplace_back(src_view.substr(last_index)); ​ return results; }
修复的核心点:使用原始src构造string_view作为根
std::string_view src_view(src);

这样带来两个关键改进:

1. substr() 变成了"视图切片",不是"创建副本"

string_view::substr()的实现机制:

  • 不会创建新的字符串

  • 只计算新的 offset + length

  • 返回的string_view始终指向原始src的内存区域

源码层面类似:

return string_view(this->data() + pos, count);

你再怎么分割,它都只是“原文的一块切片”,不会发生内存复制,也不会有临时对象。

2. 原始src在整个函数调用外都是稳定对象

你传进来的是:

const std::string& src

只要调用者保证src的生命周期≥返回的 vector 的使用生命周期,那么:

  • 所有 view 保证不悬空

  • 性能更高(完全无拷贝)

  • 内存占用更小

现在这个split就被改进了!我们马上就能跑步进入编写一个真正的split了!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/30 23:03:28

百度网盘秒传终极指南:三步掌握免下载极速传输

还在为百度网盘秒传链接的使用而烦恼吗&#xff1f;看着别人分享的神秘代码却不知如何操作&#xff1f;别担心&#xff0c;这篇完整教程将彻底解决你的困扰。百度网盘秒传技术通过文件特征值直接在服务器匹配已有文件&#xff0c;实现真正的免下载极速传输&#xff0c;不仅节省…

作者头像 李华
网站建设 2026/7/30 20:19:34

5步快速安装SlideSCI插件:完整PPT效率工具配置指南

5步快速安装SlideSCI插件&#xff1a;完整PPT效率工具配置指南 【免费下载链接】SlideSCI PPT plugin, supports one-click to add image titles, copy and paste positions, one-click image alignment, and one-click to insert Markdown (including bold, hyperlinks, and o…

作者头像 李华
网站建设 2026/7/30 10:29:40

DG-Lab郊狼控制器:颠覆性实时游戏互动惩罚系统

DG-Lab郊狼控制器&#xff1a;颠覆性实时游戏互动惩罚系统 【免费下载链接】DG-Lab-Coyote-Game-Hub 郊狼游戏控制器——战败惩罚 项目地址: https://gitcode.com/gh_mirrors/dg/DG-Lab-Coyote-Game-Hub 在游戏直播行业竞争日益激烈的今天&#xff0c;如何创造独特的观众…

作者头像 李华
网站建设 2026/7/30 15:57:57

Pandas数据科学实战指南:7大高效技巧与5个应用场景

Pandas作为Python生态中数据科学的核心工具库&#xff0c;其强大的数据处理能力让数据工作者能够高效应对各种复杂的数据分析任务。本文将通过场景化的方式&#xff0c;带你掌握Pandas的核心应用技巧。 【免费下载链接】100-pandas-puzzles 100 data puzzles for pandas, rangi…

作者头像 李华
网站建设 2026/7/30 8:35:24

Wan2.2-T2V-A14B能否生成符合AR/VR播放需求的立体视频

Wan2.2-T2V-A14B能否生成符合AR/VR播放需求的立体视频 在虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;内容制作领域&#xff0c;一个长期存在的痛点是&#xff1a;高质量三维视觉素材的生产成本高、周期长。传统流程依赖专业摄像、3D建模与动画渲染…

作者头像 李华
网站建设 2026/7/30 6:56:11

5分钟生成电影级运镜:Motion LoRA技术让静态图片“动“起来

5分钟生成电影级运镜&#xff1a;Motion LoRA技术让静态图片"动"起来 【免费下载链接】Motion-Lora-Camera-Push-In-Wan-14B-720p-I2V 项目地址: https://ai.gitcode.com/hf_mirrors/lovis93/Motion-Lora-Camera-Push-In-Wan-14B-720p-I2V 导语 只需一张静态…

作者头像 李华