我有一个基类,它提供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
它本身——但我无法想象它被公然破坏了。
我已经走到了尽头。有什么建议么?
编辑:就在我发布这个之后,明显的对齐问题突然出现在我身上。在 Windows 上可能intrusive_ptr
需要 16 字节对齐?指针不是直接分配的,而是由 Lua 的内存管理器返回的。去谷歌...