按值传递std :: string对象会发生什么?

时间:2014-01-03 15:23:12

标签: c++ stl

我们经常通过引用传递字符串对象,但很少通过value.today,当gdbing一个func调用时,我很困惑通过传递带有value.my代码的字符串对象:

 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.如果按值传递字符串不会复制原始字符,是否意味着我们不应该以这种方式传递它?

1 个答案:

答案 0 :(得分:0)

代码中有一些错误,请尝试以下方法:

#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;
}

您了解此代码中发生了什么吗? 这需要解释吗?