1

我正在C++上編寫應用程序,並使用intel檢查器進行內存分析。在C++中初始化char緩衝區

但是我有一個關於在我的記憶分析測試中發現潛在記憶問題的各種結果的問題。

我正在嘗試做一個更好的穩定的應用程序,我有幾個問題,我知道他們是基礎知識仍然在這個時候看起來太多,我有點困惑的代碼。感謝你幫助他們得到滿足。

  1. 我應該初始化char buffer [30]爲默認值嗎?
  2. 什麼應該是LPWSTR的默認vaue(我試過NULL)它仍抱怨我的成員變量未初始化的內存訪問。
  3. 初始化一個結構。我嘗試使用memset。儘管如此,剖析器看起來不愉快,並抱怨未初始化的內存訪問。

一個實例是 在我的主叫類的構造函數我已經初始化句柄作爲

m_hidHandle = NULL; //member variable and an object of struct hid_device 

在這之後我打個電話做hid_write。

,並在那裏,hid_write這inturns調用WriteFile的(這是API類hid.c)

WriteFile(dev->device_handle, buf, length, NULL, NULL); 

在這裏,我得到一個抱怨未初始化內存訪問。 我甚至試着檢查WrtieFile的api文檔。仍然不乾淨,我正在抱怨 一個內存問題。

另一個例子是 我有可變

WINHTTP_CURRENT_USER_IE_PROXY_CONFIG m_pConfig; 

在構造函數中的一員,我想的結構初始化爲NULL:

memset(&m_pConfig, 0, sizeof(WINHTTP_CURRENT_USER_IE_PROXY_CONFIG)); 

它抱怨未初始化內存訪問。我甚至試過

//proxyConfig.fAutoDetect = false; 
//proxyConfig.lpszAutoConfigUrl = NULL; 
//proxyConfig.lpszProxy = NULL; 
//proxyConfig.lpszProxyBypass = NULL; 

仍然沒有幫助。

+0

你可以發佈一些代碼,演示你在做什麼,並拋出分析器錯誤的行嗎? –

+0

我已將它們添加到最初的發佈。謝謝!!! –

+0

@linuxdeveloper,想知道,'LPWSTR'(和'WriteFile')來自哪裏?我知道Linux中沒有這樣的東西,但似乎你使用的是'hid_device',除非你在你的應用程序中本地定義它。 – chris

回答

4

1:使用std::string,這將是默認初始化:

std::string s; //empty 

否則,char s[30] = {};會以0填充它。 std::string對於穩定的應用程序來說要好得多。如果您需要將C字符串傳遞給API,請使用c_str()來獲得恆定版本。如果你需要一個非常量版本,把它放到一個字符向量中(可以用兩個迭代器初始化),然後通過&v[0]v.data()

2:NULL應該工作,因爲它是wchar_t *(假設Windows API數據類型)。如果您有C++ 11,請改爲使用nullptr

3:memset對於任何非POD類都是一個糟糕的主意。如果您沒有構造函數,則會爲您提供一個默認構造函數,用於默認初始化所有非平凡構造的成員。這是更好地把自己的,如果你有會員如int,否則將保持未初始化:

struct S { 
    int i; 
    std::string s; //non-trivially constructible, so default-initialized 
}; 

S s; 

在上面的例子中,你會得到一個空字符串和未初始化int。這就是爲什麼你自己通常更好的原因:

S() : i(), s() {} 
+0

構建的主機應用程序嗯爲什麼不v.front()?這總是我用過的。 – paulm

+0

@paulm,這也適用,但你仍然需要'&v.front()'。 – chris