今天遇到一个 std::string 字符串crash的问题。
问题代码如下面:
#include <iostream>
int main(void)
{
std::string str;
char *str2 = 0x00;
str = str + "hello" + str2;
return 0;
}
crash的时候,调用栈如下:
(gdb) bt full
#0 strlen () at ../sysdeps/arm/armv6t2/strlen.S:85
No locals.
#1 0xb6f7735c in length (__s=0x0)
at /home/charles/code/build_toolchain/build/gcc_final/arm-linux-gnueabi/libstdc++-v3/include/bits/char_traits.h:259
No locals.
#2 std::string::append (this=0xbed69cf4, __s=0x0)
at /home/charles/code/build_toolchain/build/gcc_final/arm-linux-gnueabi/libstdc++-v3/include/bits/basic_string.h:1009
No locals.
#3 0x00010910 in std::operator+<char, std::char_traits<char>, std::allocator<char> > (__lhs=..., __rhs=0x0)
at /toolchain/arm-linux-4.8.2/arm-linux-gnueabi/include/c++/4.8.2/bits/basic_string.h:2406
__str = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x21014 "hello"}}
#4 0x000107e4 in main () at test200.cpp:8
str = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0xb6fa3d38 <std::string::_Rep::_S_empty_rep_storage+12> ""}}
---Type <return> to continue, or q <return> to quit---
str2 = 0x0
可以看出,crash的原因是,函数 length()传入了一个空指针。
这个length函数原型为:
std::size_t std::char_traits<char> lengfth(const char_type *);
这和c的函数 strlen()行为是不一样的; strlen()可以接收一个空指针,返回的值为0.