【问题标题】:what happens when pass std::string object by value?按值传递 std::string 对象时会发生什么?
【发布时间】: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 "?
}
}

我的问题:

  1. 为什么“p val”在func 2中没有打印出变量“val”的正确内容,内容没有被复制到里面?
  2. 即使使用“p val.c_str()”,我也无法打印应该在其中的内容“abc”。 3.如果按值传递字符串不复制原始字符,是否意味着我们不应该以这种方式传递它?

【问题讨论】:

  • 你的意思是fun1(val,ref);
  • 尝试完全禁用优化,或者实际使用被调用函数中的变量。
  • 可能与 std::string 的 COW 实现有关。尝试使用 -std=c++11 编译您的代码并再次检查,因为 C++11 禁止 COW 用于 std::string。但我不确定,这只是一个检查选项。
  • 谢谢@Aaron 这正是我的意思。至于调试器在面对优化代码时会感到多么困惑,真的无从得知。 (我不知道这是否是这里的问题,但感觉确实如此。)

标签: c++ stl


【解决方案1】:

代码有一些错误,试试这个:

#include <cstdlib>
#include <cstdio>
#include <string>

using namespace std;

void fun1(string val, string & ref)
{
    printf("any thing....\n");
    printf("%s\t%s", val.c_str(), ref.c_str());
}

void fun2()
{
    string val = "val";
    string ref = "ref";
    fun1(val, ref);
}

int main(int argc, char ** argv)
{
    fun2();
    return EXIT_SUCCESS;
}

你明白这段代码发生了什么吗?
这需要解释吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2015-09-06
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多