C++ boost::侵入式更改指针地址
我有一个基类,它提供了C++ boost::侵入式更改指针地址,c++,visual-studio-2010,boost,smart-pointers,C++,Visual Studio 2010,Boost,Smart Pointers,我有一个基类,它提供了intrusive\u ptr\u add\u ref和intrusive\u ptr\u release供子类使用boost::intrusive\u ptr 该代码在MacOS X和Linux上100%有效。在Windows上(Visual Studio 2010,禁用优化的64位RelWithDebInfo),它适用于大多数类,但在一个特定的子类上会中断(没有任何奇怪或特殊之处)。键入以下内容时,我在调试器中停止了此事件序列: 1. T * t = get_point
intrusive\u ptr\u add\u ref
和intrusive\u ptr\u release
供子类使用boost::intrusive\u 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
。。。然后在随后的侵入式\u ptr\u add\u ref
中,指针的值是0x..7a40
。总是在前面8个字节。我现在正在查看一个堆栈跟踪-0x..38
进入了intrusive\u ptr
的构造函数,但它作为0x..40命中了引用增量函数。
我怎么知道这里发生了什么?我的第三方库都是发布版本,所以我无法追踪到intrusive\u ptr
本身,但我无法想象它会如此明显地被破坏
我在这里已经穷途末路了。有什么建议吗
编辑:就在我发布这篇文章之后,明显的对齐问题突然向我袭来。在Windows上,
intrusive_ptr
可能需要16字节对齐?指针不是直接分配的,而是由Lua的内存管理器返回的。转到Google…在进一步的调查中,我实际上能够在MacOS X上复制这个问题,方法是在基类中添加一个字段并使其大小为非零。从那以后,我追踪到了一个涉及多重继承的模糊情况(在树的其他地方,同样如此!),在这种情况下,转换到基类实际上可以更改指针的值 这可能是MSVC编译器中与堆栈对齐要求相关的错误。堆栈指针必须在任何不属于epilog或prolog的代码区域中与16字节对齐(叶函数除外)