1

我有一个基类,它提供intrusive_ptr_add_refintrusive_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 的内存管理器返回的。去谷歌...

4

1 回答 1

0

经过进一步调查,我实际上能够在 MacOS X 上复制这个问题,方法是向基类添加一个字段并使其大小不为零。从那里,我将其追踪到一个涉及多重继承的模糊情况(在树的其他地方,不少于!),其中强制转换为基类实际上可以更改指针的值!

于 2013-10-07T22:04:29.293 回答