c++ - boost::intrusive_ptr 改变指针地址

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

我有一个基类,它为子类提供 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.

我怎样才能弄清楚这里发生了什么?我的第三方库都是 Release 版本,所以我无法追踪到 intrusive_ptr 本身——但我无法想象它会被如此公然破坏。

我已经束手无策了。有什么建议吗?

编辑:就在我发布这个之后,明显的对齐问题突然出现在我面前。也许 intrusive_ptr 在 Windows 上需要 16 字节对齐?该指针不是直接分配的,而是由Lua的内存管理器返回的。去谷歌...

最佳答案

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

关于c++ - boost::intrusive_ptr 改变指针地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19212631/

相关文章:

c++ - -fno-omit-frame-pointer 没有优化

c++ - 为什么C++中有全局变量?

c# - 无法为 webservice.asmx 创建类型

c# - 运行托管在 Visual Studio 中的调试应用程序与直接运行它有什么区别?

c++ - C/C++ 中的数值转换

c++ - MC 模拟中的 openmp 私有(private)/共享数据

c++ - 如何使用 Qt 在 Windows 和 Linux 上捕获 Ctrl+C

c++ - Bentley ProjectWise Explorer - 如何获取物理文件路径 (DMS)

c++ - Stereo Vision.exe : 0xC0000005: Access violation writing location 0x00000014 中 0x77081d76 (ntdll.dll) 的未处理异常

c++ - boost 的 "windows_shared_memory"和 boost 的 "managed_windows_shared_memory"有什么区别?