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

1

ワイルドな投機的推測は、バッファ オーバーフローがこれを破損しているコード内の他の場所で、ある種のバッファ オーバーフロー ケースが発生している可能性があることを他の人が回避したことです。

コードがわかると助かります。

メモリの破損が原因でコアダンプが発生する可能性があると思いますが、気づきましたか?

于 2013-03-08T02:25:51.677 に答える
0

私自身の質問に答える:alltomの答えは実際には見た目よりも近かったのですが、最終的にはもちろんメモリの破損でした。オブジェクトがデリゲートとして使用されているため、function002が呼び出される前にfunction001内でメモリが破損しました。デリゲートは渡され、void *として格納され、Cスタイルはオブジェクトタイプにキャストバックされて、関連するメソッドを呼び出しました。

この問題は、デリゲートオブジェクトをvoid *として保存してキャストするのではなく、変数(MyDelegate *デリゲートなど)に保存することで解決されました。

于 2013-03-13T23:19:38.027 に答える