`
febird
  • 浏览: 256508 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

千万注意,不要 hack std::string

    博客分类:
  • C++
阅读更多

前段时间被一个bug折磨了两个星期,最后发现竟然是如此一个陷阱——我为了减少内存用量并且减少一次内存拷贝,直接通过string.data()修改了string的内部表示。这与其说是一个陷阱,不如说是我自己给自己造了一个陷阱然后把自己给掉进去了。发病机制可以用如下代码简单的勾画出来:

using namespace std;

 

int main(int argc, char* argv[])

{

    string str1 = "abcde";

    string str2 = str1;

 

    strcpy(const_cast<char*>(str2.data()), "1234");

 

    cout << "str1=" << str1 << endl

         << "str2=" << str2 << endl;

 

    return 0;

}

 

在windows+msvc 中的输出是:

str1=abcde
str2=1234


在linux+gcc中的输出是:

str1=1234
str2=1234

在boost::serialization中,对string的load也是采用这样的hack方式,目的也是为了减少内存用量并且减少一次内存拷贝。使用boost::serialization的同志们需要注意,不要掉进这个陷阱!

我们可以看出,在msvc中,string拷贝时是真拷贝,而在gcc中,必定是用了引用计数+copy on write。str1和str2内部引用的是同一块内存。因为string.data()和string.c_str()都是const成员,所以不会有copy,只会增加引用计数。所以导致修改str2实际上也修改了str1。

c++标准甚至允许把const string的成员放入带写保护的内存区域中,或者把string的成员实际上存储在不相邻的内存块中,而仅在调用 string.data() 或 string.c_str() 时将数据拷贝到一块临时内存中然后返回,这块临时内存将在下一次调用string的一个非const成员函数时释放,如果目标平台真这样实现,往 string.data()中写数据就会导致更加微妙的错误。

 

分享到:
评论

相关推荐

    Hack Audio:An Introduction to Computer Programming and DSP in Matlab.rar

    Hack Audio:An Introduction to Computer Programming and Digital Signal Processing in Matlab 2019 Hack Audio:An Introduction to Computer Programming and DSP in Matlab.part1.rar (15 MB, 下载次数: 237...

    HackTool.zip

    【Android 逆向】代码调试器开发 ( 使用 NDK 中的 ndk-build + Android.mk 编译 Android 平台的代码调试器可执行应用 ) https://hanshuliang.blog.csdn.net/article/details/121059532 博客代码

    Linux.101.Hacks

    **Hack 1: Use CDPATH to Define the Base Directory for cd Command** 在Linux中,`cd` 命令用于切换当前工作目录。使用环境变量 `CDPATH` 可以为 `cd` 命令定义一个或多个基础目录路径。当用户输入一个不包含斜杠...

    Linux 101 Hacks (英文原版)

    - **Hack 1: 使用`CDPATH`定义`cd`命令的基本目录** - `CDPATH`环境变量允许用户定义一个路径列表,这些路径将被添加到当前目录之前。当用户尝试更改到一个不存在的目录时,`cd`会检查`CDPATH`中的每个目录,并尝试...

    HackTools:HackTools(如当)为s7ck Team红队武器库F-Box里的一个汉化的红队浏览器插件

    欢迎使用汉化Hack工具 :hammer_and_wrench:HackTools(如当)红队浏览器插件本工具仅限于学习和研究目的;不得将上述内容用于商业或非法用途,否则后果作者概不负责HackTools(如当)为s7ck团队红队武器库F-Box里的...

    BSD Operating System Hacks

    **Hack1:充分利用默认Shell** - **技巧概述**:本技巧介绍如何充分利用BSD系统的默认Shell来提高工作效率。这包括了对Shell的一些基本设置调整,比如环境变量、命令历史记录等。 - **实践方法**:可以通过编辑用户...

    GitHack-python3.zip

    之前下载了前辈们的GitHack工具发现竟然只能在python2运行,生为程序猿的我瞬间毛血旺了,因为自己装的是python3发现尽然用不了,超灵长类生物不能忍,我瞬间打开源码对键盘一顿咔咔咔胡打,最终成功在python3运行。...

    Hack3.0:Repository3.0(包含网页)

    Hack3.0:Repository3.0(包含网页)

    [Mac.Hacks(2013.3)].Chris.Seibold.文字版

    接下来,我们将详细解释文件中列出的各个“Hack”所对应的知识点。 1. Hack01: 创建出色的备份(Create a Great Backup) - 数据备份是Mac用户应定期进行的重要操作。这个技巧可能涉及到推荐的备份方案、备份策略...

    HackNews:一个非常简单的 Hack News android 应用程序。 一个 RESTful 客户端

    "HackNews:一个非常简单的 Hack News android 应用程序。 一个 RESTful 客户端" 指的是一个专为Android平台设计的应用程序,它旨在提供对Hack News网站内容的访问。Hack News是一个热门的科技新闻分享社区,用户可以...

    MSEA-WZSearcher-HackTool:MapleStory WZ 搜索器和其他数据包工具

    MSEA-WZSearcher-HackTool 我的一个工具是在 2012 年制作的,当时我还在 MapleStory 黑客/服务器场景中。 我认为是时候将其发布给公众,供任何人使用并在此基础上进行创新。 功能: - 读取和解析地图/库存的 String....

    Brum-Hack2.0:loci brum hack存储库的方法

    《Brum-Hack2.0:深入理解Loci Brum Hack仓库的JavaScript实践》 在IT行业中,黑客马拉松(Hackathon)是一种集创新、技术与合作于一体的活动,参与者在短时间内协同开发项目,挑战极限。Brum-Hack2.0便是一个这样...

    hack413:CS413项目的源代码示例

    【标题】"hack413: CS413项目的源代码示例"指的是一个与计算机科学课程CS413相关的编程项目,其中包含了用Java语言编写的源代码示例。这个项目可能涉及到特定的课程主题,如软件开发、移动应用编程或是其他与Android...

    symfony-hackday:Symfony Hackday 存储库

    "symfony-hackday:Symfony Hackday 存储库" 指的是一个特定的项目,它是围绕 Symfony 框架的黑客日活动创建的。"Symfony Hackday" 可能是一个社区活动,参与者聚集在一起,通过实践来学习、交流和探索 Symfony 框架...

    Linux-101-Hacks

    #### Hack 1:使用 `CDPATH` 定义 `cd` 命令的基础目录 - **概述**:通常情况下,`cd` 命令用于切换当前工作目录。但通过设置环境变量 `CDPATH`,可以指定一系列目录作为 `cd` 的搜索路径,使得用户可以在这些目录间...

    css_hack csshack技术

    ### CSS Hack 技术详解及应用 #### 一、引言 随着互联网技术的发展,Web前端开发变得越来越重要。然而,在实际开发过程中,一个不容忽视的问题便是**跨浏览器兼容性**。由于不同浏览器(包括同一浏览器的不同版本...

    hack程序:Python CLI程序示例

    在这个“hack程序:Python CLI程序示例”中,我们将探讨如何利用Python来设计一个简单的菜单系统,帮助用户决定早餐、午餐或晚餐的选择。 首先,我们需要了解Python的基础语法,如变量声明、条件语句、循环和函数...

    CSS HACK收集:关于IE6/FF/google等浏览器hack的方法详细

    在网页开发中,CSS Hack是一种针对不同浏览器差异性进行调整的技术。本文主要聚焦于如何针对IE6、Firefox以及Google浏览器的特性进行CSS Hack,确保页面在各浏览器中的表现一致性。 1. **IE6下的a标签嵌套img标签...

Global site tag (gtag.js) - Google Analytics