2011-03-17 137 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