0

我有一种情况,我有一个 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();

}

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

4

4 回答 4

2

也许您正在使用多重继承,这导致指针值this依赖于上下文:

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

如果您使用 C 强制转换而不是dynamic_cast.

于 2013-03-08T02:55:35.590 回答
1

疯狂的推测性​​猜测将是其他人也没有想到的,即您可能在代码中的其他位置存在某种缓冲区溢出情况,而缓冲区溢出正在破坏这种情况。

了解代码会有所帮助。

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

于 2013-03-08T02:25:51.677 回答
1

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

于 2013-03-08T01:52:08.890 回答
0

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

该问题已通过将委托对象存储在变量中(例如:MyDelegate* 委托)而不是存储为 void* 和强制转换来解决。

于 2013-03-13T23:19:38.027 回答