サブクラスが と を使用するためのintrusive_ptr_add_ref
とを提供する基本クラスがあります。intrusive_ptr_release
boost::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 に移動...