首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正在使用{0}初始化类

正在使用{0}初始化类
EN

Stack Overflow用户
提问于 2011-03-17 08:15:14
回答 2查看 371关注 0票数 1

我正在DevPartner Studio中运行一个遗留的c++ MFC软件,他们抱怨了很多关于这些代码的问题:

代码语言:javascript
复制
PARAFORMAT pf = {0};

其中PARAFORMAT是一个类。任何以这种方式初始化的类,DevPartner都会弹出这个错误:

代码语言:javascript
复制
Write Overrun: Memory write to 0x002B9D18 (152) overruns local variable pf 0x002B9D14 (156) in function CServerWnd::OnInitDialog; parameter 1 in call to memset.

在我看来这是显而易见的,它覆盖了正确的变量。这个结构是对的吗?我可以安全地忽略警告吗?

编辑:这是PARAFORMAT

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-17 08:34:52

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

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

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

这个memset调用被DevPartner中的一个检查捕获-它不喜欢没有调用memset就设置您的本地变量的东西,并生成一个警告。

因此,在等待更多信息之前,我会说这是一个在DevPartner中失败的检查,您可以忽略它。如果您提供我们需要的其余信息,我将保留改变主意的权利:)

编辑:

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

票数 2
EN

Stack Overflow用户

发布于 2011-03-17 08:20:46

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5333358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档