在c ++中初始化char缓冲区

时间:2012-12-12 15:36:44

标签: c++ visual-c++ memory-management initialization default-value

我正在编写c ++应用程序并使用intel检查器进行内存分析。

但是我对我在内存分析测试中找到的各种结果有疑问。

我正在尝试做一个更好的稳定应用程序,我几乎没有问题,我知道它们仍然是基础知识,但此时我对代码的看法太过分了。感谢您帮助他们澄清。

  1. 我应该将char buffer [30]初始化为默认值吗?
  2. 什么应该是LPWSTR的默认值(我尝试过NULL)仍然会在我的成员变量上抱怨未初始化的内存访问。
  3. 初始化结构。我尝试使用memset。然而,分析器看起来仍然不高兴,并抱怨未初始化的内存访问。
  4. 一个例子是 在我的调用者类构造函数中,我已将句柄初始化为

    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;
    

    仍然没有帮助。

1 个答案:

答案 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() {}