boost :: intrusive_ptr改变指针地址

时间:2013-10-06 18:53:38

标签: c++ visual-studio-2010 boost smart-pointers

我有一个基类,为intrusive_ptr_add_ref的子类提供intrusive_ptr_releaseboost::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的内存管理器返回的。关闭谷歌...

1 个答案:

答案 0 :(得分:0)

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