1

サブクラスが と を使用するためのintrusive_ptr_add_refとを提供する基本クラスがあります。intrusive_ptr_releaseboost::intrusive_ptr

問題のコードは、MacOS X と Linux で 100% 動作します。Windows (Visual Studio 2010、最適化を無効にした 64 ビット RelWithDebInfo) では、ほとんどのクラスで機能しますが、特定のサブクラスで機能しなくなります (それについて奇妙なことや特別なことは何もありません)。これを入力すると、デバッガーでこの一連のイベントが停止します。

1. T * t = get_pointer_from_lua(); // Correct value returned: 0x..7a38
2. boost::intrusive_ptr p(t); // ... and passed in here

...そしてその後intrusive_ptr_add_ref、ポインタの値は です0x..7a40。常に 8 バイト先。私は今スタックトレースを見ています -のコンストラクタに0x..38入りintrusive_ptrますが、参照インクリメント関数にヒットします0x..40.

ここで何が起こっているのかをどうやって知ることができますか? 私のサード パーティ ライブラリはすべてリリース ビルドであるため、intrusive_ptrそれ自体を追跡することはできませんが、それほど露骨に壊れているとは想像できません。

私はここでロープの終わりにいます。助言がありますか?

編集:これを投稿した直後に、明らかな配置の問題が飛び出しました。Windowsintrusive_ptrでは 16 バイトのアラインメントが必要なのでしょうか? ポインタは直接割り当てられませんが、Lua のメモリ マネージャによって返されます。Google に移動...

4

1 に答える 1

0

さらに調査したところ、基本クラスにフィールドを追加してゼロ以外のサイズにすることで、MacOS X でこの問題を再現することができました。そこから、基本クラスへのキャストが実際にポインターの値を変更する可能性がある多重継承 (ツリーの他の場所でも同様です!) を含むあいまいな状況まで追跡しました。

于 2013-10-07T22:04:29.293 に答える