サブクラスが と を使用するための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 に移動...