使用{0}初始化类

时间:2011-03-17 00:15:14

标签: c++ debugging class memory

我正在将旧版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;

2 个答案:

答案 0 :(得分:2)

没有看到PARAFORMAT,这是我对发生的事情的看法。

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

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

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

所以,等待更多信息,我会说这是DevPartner的破损检查,你可以忽略它。如果/当您提供我们需要的其他信息时,我将保留改变主意的权利:)

编辑:

在看到PARAFORMAT结构后,我相信上面的描述是正确的。

答案 1 :(得分:1)

一般来说:你只能初始化一个像这样的POD,一个类是由它的构造函数初始化的。