C++ C++;:*这会在调用之间更改值
所以我在调试一个显示Segfault的程序。我运行了gdb,从回溯中我看到(this)的值在调用时发生了变化 调用函数的类型为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::
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
Bar::funcName2()
显然返回了一个空指针。这两个指针不同吗?另外,如果您有两个不同的对象(无论是哪个类),那么每个对象中的指针将不同。此
指针指向当前对象,即使在同一类的两个对象中也会不同。当然,指针是不同的Bar::funcName2()
应在Bar
实例上调用,而Foo::funcName1()
应在Foo
实例上调用。除非一个是另一个的子类(或者类似的东西),否则它们不能有相同的地址。