为什么C++中"this"的地址可能会更改?



我有一种情况,我有一个类型为Foo的对象,在调用它自己的方法时不知何故失去了在"this"中自己的地址的跟踪。我定义了这些函数:

// Bar has an instance of foo, and wishes to call a function001()...
Bar::doThingWithFoo(){
    // foo is at address 0x1a7bbb70 here...
    foo->function001();
}
// The definition of function001().  The address of "this" is as expected.
Foo::function001(){
    // the address of "this" is 0x1a7bbb70 here...
    this->function002();  
}
Foo::function002(){
    // but the address of "this" is 0xbfffe090 here!!!
    // bad things happen, as you might expect.
    this->getMyProperty()->doThing();
}

为什么会发生这样的事情?

也许您正在使用多重继承,这会导致this的指针值与上下文相关:

http://frogchunk.com/documentation/lang/cpp/Multiple_inheritance_and_the_this_pointer.pdf

如果您使用C强制转换而不是dynamic_cast,则会导致问题。

我同意我们需要查看实际代码的注释。我会推测0xbfffe090看起来像堆栈上的地址,这意味着你可能意外地复制了你的对象,然后在复制上调用了一个方法。它还可能与某些本地地址的某种内存损坏(例如覆盖本地数组)相一致。

大胆的猜测将是其他人也回避的,您可能在代码的其他地方有某种缓冲区溢出的情况,缓冲区溢出正在破坏这个。

知道代码会有帮助的。

我可以想象,如果它的内存损坏,它会导致它有一个核心转储,你注意到一个吗?

回答我自己的问题:alltom的答案实际上比看起来更接近,但最终当然是内存损坏。在调用function002之前,由于将对象用作委托,因此function001内部的内存损坏。委托被传递并存储为void*,并以c风格强制转换回其对象类型以调用其相关方法。

通过将委托对象存储在变量中(例如:MyDelegate* delegate)而不是将其存储为void*并进行类型转换,解决了这个问题。

最新更新