gpt4 book ai didi

c++ - 成员因以下成员的初始化而损坏

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:36 26 4
gpt4 key购买 nike

在我的类 CTestController 初始化期间,一个成员 std::vector 被破坏,我不知道是什么导致了这种行为。

情况如下:

class TestController
{
// ...
CReport m_report;
CTestInspector m_testInspector;
// ...
}

这些成员在 CTestController 的构造函数中隐式实例化。

class CReport : public CGenericReport
{
// ...
std::vector<SReportData> m_data;
}

class CGenericReport
{
// ...
COLORREF m_bgColor;
const short m_dmOrient;
long m_defaultCX;
long m_defaultCY;
CWnd m_wnd;
}

m_dataCReport 的最后一个成员元素。它被正确初始化为 size = capacity = 0。

结构没什么特别的:

struct SReportData
{
CPoint pos;
std::tstring text;
int fontType;
COLORREF color;
};

CReport 中的m_data 初始化后,我保存了它的_Myend 指针的地址:
0x03D84500
CTestController 中的成员 m_testInspector 位于 (&m_testInspector ):
0x03D84502!
这会破坏 _Myend 指针,导致 CReport.m_data 中出现错误的 capacity(例如 3014656)。

造成这种损坏的原因可能是什么?

附加信息:

  • 清理/重建没有帮助
  • 我正在使用 MFC 和 Unicode
  • 升级到 Visual Studio 2013 后出现同样的问题
  • CGenericReport 作为CReport 属于另一个DLL 项目,将它移动到同一个模块没有帮助
  • sizeof(SReportData) = 44
  • std::tstring 是类型定义的 std::wstring

最佳答案

不同的成员对齐/填充是问题所在。

我观察到,在两个模块中,CGenericReport 的大小不同:136 对 134,同时包含相同的头文件。

在一种情况下,m_defaultCX 成员直接位于 2 字节成员 m_dmOrient 之后,而在另一种情况下,包含 2 个字节以填充到 8 字节对齐。

然后我检查了项目属性中的对齐设置(/ZpC/C++代码生成选项卡中的结构成员对齐 ).两者都设置为默认(根据文档= 8 字节)。
然而,当我插入一个

#pragma pack(show)

进入CGenericReport头文件,编译报告

warning C4810: value of pragma pack(show) == 8
...
warning C4810: value of pragma pack(show) == 1

对于这个位置,顺序不同。

最后我开始关注 #pragma pack指令

#pragma pack(1)

在覆盖项目设置并导致此行为的另一个 header 的末尾使用。删除它使我摆脱了这个麻烦。现在 CGenericReport 的打包对齐对于每个模块都是相同的。

关于c++ - 成员因以下成员的初始化而损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22248170/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com