1

我正在 C++ 上编写应用程序并使用英特尔检查器进行内存分析。

但是,我对在内存分析测试中获得的各种结果有疑问,以发现潜在的内存问题。

我正在尝试做一个更好的稳定应用程序,我有几个问题我知道它们仍然是基础知识,此时我对代码进行了太多研究,我有点困惑。感谢您帮助他们澄清。

  1. 我应该将 char buffer[30] 初始化为默认值吗?
  2. 什么应该是 LPWSTR 的默认值(我试过 NULL)它仍然抱怨我的成员变量上的未初始化内存访问。
  3. 初始化一个结构。我尝试使用 memset。探查器仍然看起来不高兴并抱怨未初始化的内存访问。

一个实例是在我的调用者类构造函数中,我已将句柄初始化为

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;

在构造函数中,我试图将结构初始化为 NULL:

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

它抱怨未初始化的内存访问。我什至试过

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

仍然没有帮助。

4

1 回答 1

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;

在上面的示例中,您将获得一个空字符串和 uninitialized int。这就是为什么你自己的通常更好:

S() : i(), s() {}
于 2012-12-12T15:42:52.647 回答