C++ C++;:*这会在调用之间更改值

C++ C++;:*这会在调用之间更改值,c++,debugging,gdb,C++,Debugging,Gdb,所以我在调试一个显示Segfault的程序。我运行了gdb,从回溯中我看到(this)的值在调用时发生了变化 调用函数的类型为 Foo::funcName1() const { return Bar::funcName2()->calledFunc(); } 被调用函数的形式为 Foo2::calledFunc() const { /* Some stuff */ } 根据我的回溯 0x00007ff456a9ec9f in Blah::Meh::

所以我在调试一个显示Segfault的程序。我运行了gdb,从回溯中我看到(this)的值在调用时发生了变化

调用函数的类型为

Foo::funcName1() const {
    return Bar::funcName2()->calledFunc();
}  
被调用函数的形式为

Foo2::calledFunc() const {
    /*
     Some stuff
    */
}
根据我的回溯

0x00007ff456a9ec9f in Blah::Meh::funcName1() const (this=0x1f59b40)
0x00007ff44fee181c in Foo2::calledFunc() const (this=0x0)

这是怎么发生的?

回答问题的标题:您正在对不同的对象调用方法<代码>此指向当前对象,因此可以在其中更改


要回答特定的segfault:我假设
funcName2
返回
nullptr
。您应该检查一下,在调用
calledFunc

之前,是否存在听起来多余的风险

指向您正在调用方法的对象。如果您有两个对象,并且对这两个对象都调用了一个方法,那么它们都将有一个不同的
this
指针

在代码中,funcName2()返回空指针。因此,您正在对空对象调用一个方法。即使如此,该方法也会返回一些东西,但是由于您已经取消了对空指针的引用,因此程序的行为现在是未定义的

您应该确保不取消对空指针的引用。两种选择:

  • 使
    funcName2()
    不返回
    NULL
  • 在尝试对其执行任何操作之前,请确保调用函数验证
    funcName2()
    的返回值不是
    NULL

由于您有seg故障,因此可以肯定地说,无论是什么原因导致了错误,都会导致许多问题,包括内部指针。请尝试创建一个seg并向我们展示一下,好吗?您显示的代码片段并没有真正告诉我们任何事情。我们只能猜测,
Bar::funcName2()
显然返回了一个空指针。这两个指针不同吗?另外,如果您有两个不同的对象(无论是哪个类),那么每个对象中的
指针将不同。
指针指向当前对象,即使在同一类的两个对象中也会不同。当然,指针是不同的
Bar::funcName2()
应在
Bar
实例上调用,而
Foo::funcName1()
应在
Foo
实例上调用。除非一个是另一个的子类(或者类似的东西),否则它们不能有相同的地址。