我正在编写c ++应用程序并使用intel检查器进行内存分析。
但是我对我在内存分析测试中找到的各种结果有疑问。
我正在尝试做一个更好的稳定应用程序,我几乎没有问题,我知道它们仍然是基础知识,但此时我对代码的看法太过分了。感谢您帮助他们澄清。
一个例子是 在我的调用者类构造函数中,我已将句柄初始化为
m_hidHandle = NULL; //member variable and an object of struct hid_device
之后我打电话去做hid_write。
在那里,hid_write内部调用writeFile(这是api类hid.c)
WriteFile(dev->device_handle, buf, length, NULL, NULL);
这里我抱怨未初始化的内存访问。 我甚至尝试检查WrtieFile的api文档。仍然不清楚我要抱怨的是什么 记忆问题。
另一个例子是 我有一个成员变量
WINHTTP_CURRENT_USER_IE_PROXY_CONFIG m_pConfig;
在构造函数中,我试图将struct初始化为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 :(得分: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() {}