2011-03-17 78 views
1

I'm运行传统的C++ MFC软件进入DevPartner Studio和他们抱怨了很多关于这些行:初始化类具有{0}

PARAFORMAT pf = {0}; 

凡PARAFORMAT为A类。被初始化这样任何类,提高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; 
+1

向我们展示PARAFORMAT。 – Erik 2011-03-17 00:19:28

回答

2

没有看到PARAFORMAT,这里是我看看会发生什么。

PARAFORMAT是一个POD结构/类,大小为156字节。您的初始化器语法强制编译器生成代码以初始化该类的所有成员。初始化时,该类的所有成员将实际写入0。

因此,编译器会设置您在初始化程序列表中指定的初始值0,然后将clever和memset的结构的其余部分设置为0,而不是单独设置每个成员变量。

这个memset调用被DevPartner中的一个检查所捕获 - 它不喜欢在没有调用memset的情况下memset你的本地变量,并产生一个警告。

因此,等待更多信息,我会说这是DevPartner中的一个损坏检查,您可以忽略它。

看到PARAFORMAT结构我认为,上面的描述是正确的之后:如果/当你提供我们所需要的信息:)

编辑的其余部分,我会保留我改变主意的权利。

+0

好的答案!我将PARAFORMAT放入主题中供您检查! – bratao 2011-03-17 00:49:54

+0

@bratao:好的,我认为检查有问题 - 初始化程序列表的使用是正确和明确的。我会说忽略这些警告(或者告诉DevPartner人员修复他们的东西) – Erik 2011-03-17 01:00:13

1

一般地讲:你只能初始化POD这样,一类是由它的构造函数初始化。

+1

一个类可以是POD。 – Erik 2011-03-17 00:22:49

+0

我把PARAFORMAT放在话题 – bratao 2011-03-17 00:49:05