Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::侵入式更改指针地址_C++_Visual Studio 2010_Boost_Smart Pointers - Fatal编程技术网

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字节对齐(叶函数除外)