我有一個基類,它提供intrusive_ptr_add_ref
和intrusive_ptr_release
供子類與boost::intrusive_ptr
一起使用。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.
我怎樣才能找出這裏發生了什麼?我的第三方庫都是Release版本,所以我無法追蹤到intrusive_ptr
本身 - 但我無法想象它是如此明目張膽的破碎。
我在這裏結束了我的繩索。有什麼建議麼?
編輯:就在我發佈這個之後,明顯的對齊問題就跳出來了。也許intrusive_ptr
需要在Windows上16字節對齊?指針不是直接分配的,而是由Lua的內存管理器返回的。 Off to Google ...
這可能是MSVC編譯器中與堆棧對齊要求相關的錯誤。 http://msdn.microsoft.com/en-us/library/ms235286.aspx 「堆棧指針必須對齊到16個字節,除了葉函數,在任何非代碼區域的代碼區域一個結語或序言。「 –