由于工作需要,最近温习一下c++;
当看到c++的string类时,不禁有些疑惑,我们先看看令我疑惑的代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1;
string s2 = "hello";
s1 = s2;
return 0;
}
我们创建了两个string对象,第一个string对象没有初始化,第二个对象初始化为"hello",然后将s2拷贝给s1;
我很奇怪,s1没有初始化,内存怎么分配?
待着这个疑问,我用gdb查看了内存排布:
gdb
(gdb) file hello_string
(gdb) b 9
(gdb) r
(gdb) (gdb) p &s1
$1 = (std::__cxx11::string *) 0x7fffffffe420
(gdb) b 11
(gdb) n
(gdb) x /30cb &s1
0x7fffffffe420: 48 '0' -28 '\344' -1 '\377' -1 '\377' -1 '\377' 127 '\177' 0 '\000' 0 '\000'
0x7fffffffe428: 5 '\005' 0 '\000' 0 '\000' 0 '\000' 0 '\000' 0 '\000' 0 '\000' 0 '\000'
0x7fffffffe430: 104 'h' 101 'e' 108 'l' 108 'l' 111 'o' 0 '\000' 0 '\000' 0 '\000'
0x7fffffffe438: 3 '\003' 12 '\f' 64 '@' 0 '\000' 0 '\000' 0 '\000'
(gdb) p &s2
$2 = (std::__cxx11::string *) 0x7fffffffe440
可以看到,s1的地址在0x7fffffffe420,而真正存放hello的地方在0x7fffffffe430,而s2的地址在0x7fffffffe440。
具体string类的原理,还需要阅读源码。以上只是一个小实验。