【发布时间】:2014-01-03 15:23:11
【问题描述】:
我们经常通过引用传递字符串对象,但很少通过值传递。今天,当 gdbing 一个 func 调用时,我对使用 value 传递字符串对象感到困惑。我的代码:
fun1(string val,string& ref){
printf("any thing....");
}
fun2(){
std:string val = "abc";
std:string ref = "abc";
fun2(val,ref);
}
在 gdb 内:
p ref
$1 = (string &) @0x7fff61f28a30: {
static npos = 18446744073709551615,
_M_dataplus = {
<std::allocator<char>> = {
<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
members of std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Alloc_hider:
_M_p = 0x1f230078 "abc"
}
}
p val
$2 = {
static npos = 18446744073709551615,
_M_dataplus = {
<std::allocator<char>> = {
<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
members of std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Alloc_hider:
_M_p = 0x7fff61f28a40 "?
}
}
我的问题:
- 为什么“p val”在func 2中没有打印出变量“val”的正确内容,内容没有被复制到里面?
- 即使使用“p val.c_str()”,我也无法打印应该在其中的内容“abc”。 3.如果按值传递字符串不复制原始字符,是否意味着我们不应该以这种方式传递它?
【问题讨论】:
-
你的意思是
fun1(val,ref);? -
尝试完全禁用优化,或者实际使用被调用函数中的变量。
-
可能与 std::string 的 COW 实现有关。尝试使用
-std=c++11编译您的代码并再次检查,因为 C++11 禁止 COW 用于 std::string。但我不确定,这只是一个检查选项。 -
谢谢@Aaron 这正是我的意思。至于调试器在面对优化代码时会感到多么困惑,真的无从得知。 (我不知道这是否是这里的问题,但感觉确实如此。)