这是GCC版本5.x的情况下的分析,在GCC版本4.x的情况下std::string的内存布局将不同。逆向C++的过程中经常遇到std::string,它在内存中的状态是什么样呢?我先简单地写了一个程序,里面用到了string,使用:clang++ -Xclang -fdump-record-layouts xxx.cpp 可以将xxx.cpp中涉及到的C++的对象的内存布局给打印出来,当然看源码也可以看得到,不过没这个直接。

*** Dumping AST Record Layout

0 | class __gnu_cxx::new_allocator<char> (empty)

| [sizeof=1, dsize=0, align=1,

| nvsize=0, nvalign=1]

*** Dumping AST Record Layout

0 | class std::allocator<char> (empty)

0 | class __gnu_cxx::new_allocator<char> (base) (empty)

| [sizeof=1, dsize=0, align=1,

| nvsize=1, nvalign=1]

*** Dumping AST Record Layout

0 | struct std::__cxx11::basic_string<char, struct std::char_traits<char>, class std::allocator<char> >::_Alloc_hider

0 |     class std::allocator<char> (base) (empty)

0 |         class __gnu_cxx::new_allocator<char> (base) (empty)

0 |     pointer _M_p

| [sizeof=8, dsize=8, align=8,

| nvsize=8, nvalign=8]

*** Dumping AST Record Layout

0 | union std::__cxx11::basic_string<char, struct std::char_traits<char>, class std::allocator<char> >::(anonymous at /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/basic_string.h:119:7)

0 |     char [16] _M_local_buf

0 |     size_type _M_allocated_capacity

| [sizeof=16, dsize=16, align=8,

| nvsize=16, nvalign=8]

*** Dumping AST Record Layout

0 | class std::__cxx11::basic_string<char>

0 |     struct std::__cxx11::basic_string<char, struct std::char_traits<char>, class std::allocator<char> >::_Alloc_hider _M_dataplus

0 |         class std::allocator<char> (base) (empty)

0 |             class __gnu_cxx::new_allocator<char> (base) (empty)

0 |         pointer _M_p

8 |     size_type _M_string_length

16 |     union std::__cxx11::basic_string<char, struct std::char_traits<char>, class std::allocator<char> >::(anonymous at /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/basic_string.h:119:7)

16 |         char [16] _M_local_buf

16 |         size_type _M_allocated_capacity

| [sizeof=32, dsize=32, align=8,

| nvsize=32, nvalign=8]

class std::__cxx11::basic_string<char>就是我们提到的string,上面的如果仔细看的话,能看出string的结构就是:

+0 pointer _M_P

+8 size_type _M_string_length

+16 union {

char [16] _M_local_buf;

size_type _M_allocated_capacity;

};

当字符串的长度小于等于15时,union的变量就是_M_local_buf,而字符串的长度大于15的时候,union的变量就是_M_allocated_capacity;_M_P是字符串内容指针,_M_string_length是字符串的长度。在string的构造函数中,_M_P一般会指向+16的位置,随着string的长度变化,会动态地申请内存存放string的内容,这个时候_M_P将会指向新的位置,而+16的位置则存放当前申请到内存的大小,也就是string的capacity。所以在字符串析构函数中,如果_M_P不指向+16的位置,那么就要动态free(_M_P)。

关于C++中的string的小知识点的更多相关文章

  1. Java学习过程中的总结的小知识点(长期更新)

    Java学习过程中的总结的小知识点 (主要是自己不会的知识和容易搞错的东西) 计算某个程序运行的时间 long stime=System.currentTimeMillis(); copy3(file ...

  2. Java中容易遗漏的小知识点( 一 )(为了和小白一样马上要考试的兄弟准备的,希望小白和大家高过不挂)

    笔者csdn博客同文地址:https://blog.csdn.net/weixin_45791445/article/details/106597515 我是小康小白,一个平平无奇的Java小白.热爱 ...

  3. matlab中常用见的小知识点

    矩阵相关: 在matlab中,矩阵或向量是 column-major 表示形式.用 [] 来构建向量或矩阵, 用()来引用向量或矩阵中的元素:用:表示矩阵中的该index下的所以元素: matlab中 ...

  4. C#中PadLeft和PadRight小知识点

    当我们显示字符串数据时,有时候我们需要考虑数据的排列美观. 比如一些人名和一些编号,我们想让他们整齐对齐显示等. C# String类提供了2种操作方法: String.PadLeft(int tot ...

  5. js中全局变量的一点小知识点

    js中有三种方式定义全局变量: 在任何函数外面直接执行var语句,例如:var f="value"; 直接添加一个属性到全局变量上,在web浏览器中,全局对象名为window.例如 ...

  6. easyui中的combobox小知识点~~

    一直使用的easyui中,一些不为人知的小知识点,与君共勉: 1.combobox设置高度:使用panelHeight属性: 2.combobox本身自带“自动补全”功能,但是在浏览器中是有限制的,在 ...

  7. 关于Java中的String类知识点小总结

    Java中的String类知识点 前言 在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 如何创建字符串 最简单的方式 String str = "he ...

  8. js中关于value的一个小知识点(value既是属性也是变量)

    今天在学习input的value值时,发现这么一个小知识点,以前理解不太透彻. [1]以下这种情况是常见情况,会弹出“测试内容” <input type="button" v ...

  9. python中的小知识点

    这里是一些小知识点的汇集,为的是以后查找的方便. 行与缩进: 物理行:实际看到的代码行数. 逻辑行:在意义上的函数(即解释器执行的行数) 如果一个物理行中包含了多个逻辑行,则每个逻辑行之间需要用分号 ...

随机推荐

  1. MyBatis笔记——EhCache二级缓存

    介绍 ehcache是一个分布式缓存框架. 我们系统为了提高系统并发,性能.一般对系统进行分布式部署(集群部署方式)  不使用分布缓存,缓存的数据在各各服务单独存储,不方便系统开发.所以要使用分布式缓 ...

  2. json学习之JSONArray的应用(转载)

    从json数组中得到相应java数组,如果要获取java数组中的元素,只需要遍历该数组. 1 /** 2 * 从json数组中得到相应java数组 3 * JSONArray下的toArray()方法 ...

  3. css3中的动画功能

    直接用我的一段代码演示下css3中实现动画效果的事例,让一个div自动旋转起来 代码如下: <!doctype html> <html lang="en"> ...

  4. 160414、java上传文件以流方式判断类型

    public enum FileType {       /**        * JEPG.        */       JPEG("FFD8FF"),          / ...

  5. Java技术大牛需要学习的25个技能

    你需要精通面向对象分析与设计(OOA/OOD).涉及模式(GOF,J2EEDP)以及综合模式.你应该了解UML,尤其是class.object.interaction以及statediagrams. ...

  6. centos7 启动docker失败--selinux-enabled=false

    centos7,执行完安装命令: yum install docker 执行启动命令: systemctl   start docker  ,报下面错误: Error starting daemon: ...

  7. apache2.2版本 configuration error: couldn't perform authentication. AuthType not set!: /

    configuration error:  couldn't perform authentication. AuthType not set!: /  500服务器错误 解决方案: <Dire ...

  8. Mybatis框架学习总结-表的关联查询

    一对一关联 创建表和数据:创建一张教师表和班级表,这里假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. CREATE TABLE teacher( t_id INT PRIM ...

  9. (2.10)备份与还原--利用T-SQL进行备份还原

    常用: /************ 一.数据库备份 ************/ with init,format,stats=1init:覆盖format:格式化备份集stats=1:显示进度条 ST ...

  10. 前端 javascript 数据类型 字符串

    字符串是由字符组成的数组,但在JavaScript中字符串是不可变的:可以访问字符串任意位置的文本,但是JavaScript并未提供修改已知字符串内容的方法. obj.charAt(n) 返回字符串中 ...