C ++ - 在使用std :: string成员传入结构时,gdb会产生意外的输出

时间:2015-12-23 00:34:17

标签: c++ gdb

考虑以下程序,我使用g++ -g myprog.cc编译。

#include<iostream>

struct Context {
    //char *s; // version 1
    std::string s; // version 2
};

void f(Context);
void f(Context c) {}

int main(void) {
    Context c = Context();
    f(c);
}

版本1有char *成员,而版本2则用std::string替换它。

使用gdb,我逐步完成代码并获取:

  

临时断点1,main()at myprog.cc:12
  12上下文c =上下文();
  &amp; ebsp;缺少单独的debuginfos,请使用:debuginfo-install libgcc-4.4.7-11.el6.x86_64 libstdc ++ - 4.4.7-11.el6.x86_64
  (gdb)s
  13 f(c);
  (gdb)s
  f(c = ...)at myprog.cc:9
  9 void f(上下文c){}
  (gdb)s
  main()at myprog.cc:14
  14}

这里没有错。

如果我单步执行第2版,我会得到:

  

临时断点1,main()at myprog.cc:12
  12上下文c =上下文();
  如果缺少单独的debuginfos,请使用:debuginfo-install libgcc-4.4.7-11.el6.x86_64 libstdc ++ - 4.4.7-11.el6.x86_64
  (gdb)s
  在myprog.cc:3的Context :: Context(this = 0x7fffffffe400)   3结构语境{
  (gdb)s
  main()at myprog.cc:13
  13 f(c);
  (gdb)s
  在myprog.cc:3的Context :: Context(this = 0x7fffffffe410)   3结构语境{
  (gdb)s
  f(c = ...)at myprog.cc:9
  9 void f(上下文c){}
  (gdb)s
  在myprog.cc:3上下文::〜上下文(这= 0x7fffffffe410,__ in_chrg =)   3结构语境{
  (gdb)s
  在myprog.cc:3上下文::〜上下文(这= 0x7fffffffe400,__ in_chrg =)   3结构语境{
  (gdb)s
  main()at myprog.cc:14
  14}

为什么当我使用Context成员传递结构std::string时,我得到输出Context::Context (this=0x7fffffffe400)

此外,当我实例化结构时,this=0x7fffffffe400。当我传入时,this=0x7fffffffe410。那是为什么?

2 个答案:

答案 0 :(得分:0)

您将值c传递给不执行任何操作的函数。因此编译器必须产生任意值传递的语义效果。编译器不能确定复制然后销毁string没有后果,所以它做到了。可以肯定的是,复制char *并销毁副本没有任何后果,所以它不会打扰。

答案 1 :(得分:0)

您正在发生的事情是您看到编译器生成的构造函数,该构造函数不是仅使用指针生成的结构,因为在该构造函数中无需执行任何操作。对于具有std::string成员的结构,它可能会调用std::string的构造函数。

由于构造函数是一个非静态成员函数,this=0x7fffffffe400是隐含的&#39;这个&#39;传入的指针参数。