我正在将旧版c ++ MFC软件运行到DevPartner Studio中,他们对这些内容抱怨很多:
PARAFORMAT pf = {0};
PARAFORMAT是一个类。任何以这种方式初始化的类,DevPartner都会弹出这个错误:
Write Overrun: Memory write to 0x002B9D18 (152) overruns local variable pf 0x002B9D14 (156) in function CServerWnd::OnInitDialog; parameter 1 in call to memset.
对我来说显然是重写了正确的变量。 这种结构是对的吗?我可以放心地忽略这些警告吗?
编辑: 这是PARAFORMAT
typedef struct _paraformat
{
UINT cbSize;
DWORD dwMask;
WORD wNumbering;
WORD wEffects;
LONG dxStartIndent;
LONG dxRightIndent;
LONG dxOffset;
WORD wAlignment;
SHORT cTabCount;
LONG rgxTabs[MAX_TAB_STOPS];
} PARAFORMAT;
答案 0 :(得分:2)
没有看到PARAFORMAT,这是我对发生的事情的看法。
PARAFORMAT是一个POD结构/类,大小为156字节。初始化语法强制编译器生成代码以初始化类的所有成员。初始化时,该类的所有成员将有效地写入0。
因此,编译器设置您在初始化列表中指定的初始值0,然后是聪明的并且memset将结构的其余部分设置为0,而不是单独设置每个成员变量。
这个memset调用是由DevPartner中的一个检查捕获的 - 它不喜欢在没有调用memset的情况下memset你的本地变量,并生成警告。
所以,等待更多信息,我会说这是DevPartner的破损检查,你可以忽略它。如果/当您提供我们需要的其他信息时,我将保留改变主意的权利:)
编辑:
在看到PARAFORMAT结构后,我相信上面的描述是正确的。
答案 1 :(得分:1)
一般来说:你只能初始化一个像这样的POD,一个类是由它的构造函数初始化的。