我正在DevPartner Studio中运行一个遗留的c++ MFC软件,他们抱怨了很多关于这些代码的问题:
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;发布于 2011-03-17 08:34:52
在没有看到PARAFORMAT的情况下,这里是我对发生的事情的看法。
PARAFORMAT是一个POD结构/类,大小为156字节。初始值设定项语法强制编译器生成代码来初始化类的所有成员。类的所有成员在初始化时都将有效地写入0。
因此,编译器将初始化器列表中指定的初始0设置为0,然后巧妙地将memset结构的其余部分设置为0,而不是单独设置每个成员变量。
这个memset调用被DevPartner中的一个检查捕获-它不喜欢没有调用memset就设置您的本地变量的东西,并生成一个警告。
因此,在等待更多信息之前,我会说这是一个在DevPartner中失败的检查,您可以忽略它。如果您提供我们需要的其余信息,我将保留改变主意的权利:)
编辑:
看过PARAFORMAT结构后,我相信上面的描述是正确的。
发布于 2011-03-17 08:20:46
一般来说:你只能这样初始化一个POD,一个类是由它的构造函数初始化的。
https://stackoverflow.com/questions/5333358
复制相似问题