【发布时间】:2010-10-12 17:42:21
【问题描述】:
我无法解释我继承的 C++ 类的 char[] 数组中似乎有什么错误寻址。我正在使用 Visual Studio 2005 并将问题范围缩小到:
MyClass.h:
class MyClass {
public:
MyClass();
virtual ~MyClass();
void Reset();
// More member functions. . .
char m_szString[128];
// More member variables. . .
}
MyClass.cpp:
MyClass::MyClass() { Reset(); }
MyClass::Reset() { m_szString[0] = 'X'; }
// . . .
当我单步执行程序时,我发现Reset() 函数实际上将m_szString[4] 设置为'X'——而不是m_szString[ 0] 正如我所料。根据监视窗口,m_szString[] 之前的类中唯一的元素是指向 vftable 的指针,__vfptr,恰好是 4 个字节。
如果我向MyClass 添加更多成员变量,则后续字符串会被各种错误寻址,并且总是增加4 个字节的倍数。不仅仅是 aligned 到 4 字节边界,而是实际上 offset 为 4 的倍数。就好像编译器为每个 vftable 跳过了两倍的必要空间......但那是纯属猜测。
报告了一些类似的问题(Google、MSDN),但我没有找到任何答案。
其他信息/部分解决方案:该类是成为 DLL 的包装类的唯一成员变量。父级最初声明为
class ATL_NO_VTABLE CWrapperClass
删除ATL_NO_VTABLE 修复了对齐问题。
我仍然看到缓冲区溢出,但应该很容易找到。
您能否解释一下ATL_NO_VTABLE 对于嵌入式 C 开发人员的解释,他们在 BSTR 之外的 COM 经验非常有限,或者更好的是,提供一个指向良好参考的指针(抱歉)?
还有更多:This question 提供了一些有用的调试信息。
感谢您的帮助。
【问题讨论】:
-
您可以使用打印语句并在发布模式下尝试一下吗?
-
你能给出一个完整的工作示例来演示这个问题吗?
-
这里肯定比你提到的要多 - 例如,关于“调整器 thunks”的评论让我感到怀疑。
-
@Andrew:正如我现在所知道的那样。我仍在研究代码,对 COM 更加困惑。感谢您继续挖掘的动力!
标签: arrays visual-c++ visual-studio-2005 pointers