2013-10-06 37 views
1

我有一個基類,它提供intrusive_ptr_add_refintrusive_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 ...

+1

這可能是MSVC編譯器中與堆棧對齊要求相關的錯誤。 http://msdn.microsoft.com/en-us/library/ms235286.aspx 「堆棧指針必須對齊到16個字節,除了葉函數,在任何非代碼區域的代碼區域一個結語或序言。「 –

回答

0

在進一步的調查中,我實際上能夠在MacOS X上覆制此問題,方法是向基類添加一個字段並將其設置爲非零大小。從那裏,我將它追蹤到一個涉及多重繼承(樹中其他地方,不會少!)的隱晦情況,其中鑄造到基類實際上可以更改指針的值!