我有一个基类,它为子类提供 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.
我怎样才能弄清楚这里发生了什么?我的第三方库都是 Release 版本,所以我无法追踪到 intrusive_ptr
本身——但我无法想象它会被如此公然破坏。
我已经束手无策了。有什么建议吗?
编辑:就在我发布这个之后,明显的对齐问题突然出现在我面前。也许 intrusive_ptr
在 Windows 上需要 16 字节对齐?该指针不是直接分配的,而是由Lua的内存管理器返回的。去谷歌...
最佳答案
经过进一步调查,我实际上能够在 MacOS X 上重现这个问题,方法是向基类添加一个字段并使其大小不为零。从那里,我追踪到一个涉及多重继承的模糊情况(树中的其他地方,不少!),转换到基类实际上可以更改指针的值!
关于c++ - boost::intrusive_ptr 改变指针地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19212631/