我有一个基类,为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.
我怎样才能弄清楚这里发生了什么?我的第三方库都是Release版本,因此我无法追溯到intrusive_ptr
本身 - 但我无法想象它是如此公然破坏。
我在这里结束了。有什么建议吗?
编辑:刚发布此消息后,显而易见的对齐问题突然出现在了我面前。也许intrusive_ptr
需要在Windows上进行16字节对齐?指针不是直接分配的,而是由Lua的内存管理器返回的。关闭谷歌...
答案 0 :(得分:0)
在进一步调查中,我实际上能够在MacOS X上复制此问题,方法是在基类中添加一个字段并使其非零。从那里,我追溯到一个涉及多重继承的模糊情况(在树的其他地方,不能少!),其中转换到基类实际上可以更改指针的值!