在c+中初始化字符缓冲区+; 我正在C++上编写应用程序,使用英特尔检查器进行内存分析。

在c+中初始化字符缓冲区+; 我正在C++上编写应用程序,使用英特尔检查器进行内存分析。,c++,visual-c++,memory-management,initialization,default-value,C++,Visual C++,Memory Management,Initialization,Default Value,然而,我有一个关于我在内存分析测试中发现潜在内存问题的各种结果的问题 我正在尝试做一个更好的稳定的应用程序,我有几个问题,我知道他们在这个时候仍然是基本的看太多的代码,我有点困惑。谢谢你帮我把它们弄清楚 我应该将字符缓冲区[30]初始化为默认值吗 LPWSTR的默认值应该是什么(我尝试了NULL),但它仍然抱怨对成员变量的未初始化内存访问 初始化结构。我试着使用memset。但是探查器看起来不高兴,并抱怨未初始化的内存访问 一个例子是 在调用方类构造函数中,我已将句柄初始化为 m_hidHand

然而,我有一个关于我在内存分析测试中发现潜在内存问题的各种结果的问题

我正在尝试做一个更好的稳定的应用程序,我有几个问题,我知道他们在这个时候仍然是基本的看太多的代码,我有点困惑。谢谢你帮我把它们弄清楚

  • 我应该将字符缓冲区[30]初始化为默认值吗
  • LPWSTR的默认值应该是什么(我尝试了NULL),但它仍然抱怨对成员变量的未初始化内存访问
  • 初始化结构。我试着使用memset。但是探查器看起来不高兴,并抱怨未初始化的内存访问
  • 一个例子是 在调用方类构造函数中,我已将句柄初始化为

    m_hidHandle = NULL; //member variable and an object of struct hid_device
    
    之后我打电话给你写信

    在那里,hid_编写哪个inturns调用writeFile(这是api类hid.c)

    在这里我得到一个抱怨,未初始化的内存访问。 我甚至试着查看api文档中的WrtieFile。还是不干净我在抱怨什么 记忆问题

    另一个例子是 我有一个成员变量

    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;
    

    仍然没有帮助。

    1:使用
    std::string
    ,它将被默认初始化:

    std::string s; //empty
    
    struct S {
        int i;
        std::string s; //non-trivially constructible, so default-initialized
    };
    
    S s;
    
    否则,
    chars[30]={}将用0填充它<对于稳定的应用程序来说,code>std::string
    要好得多。如果需要将C字符串传递给API,请使用
    C_str()
    获取恒定版本。如果您需要一个非常量版本,请将其放入一个字符向量(可以用两个迭代器初始化)并传递
    &v[0]
    v.data()

    2:
    NULL
    应该可以工作,因为它是一个
    wchar\u t*
    (假设为Windows API数据类型)。如果您有C++11,请改用
    nullptr

    3:
    memset
    对于任何非POD类来说都是一个糟糕的主意。如果您没有构造函数,将为您提供一个默认构造函数,默认构造函数初始化所有非平凡的可构造成员。如果您有
    int
    等未初始化的成员,最好输入您自己的成员:

    std::string s; //empty
    
    struct S {
        int i;
        std::string s; //non-trivially constructible, so default-initialized
    };
    
    S s;
    
    在上面的示例中,您将得到一个空字符串和未初始化的
    int
    。这就是为什么你自己的通常更好:

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

    1:使用
    std::string
    ,默认初始化:

    std::string s; //empty
    
    struct S {
        int i;
        std::string s; //non-trivially constructible, so default-initialized
    };
    
    S s;
    
    否则,
    chars[30]={}将用0填充它<对于稳定的应用程序来说,code>std::string
    要好得多。如果需要将C字符串传递给API,请使用
    C_str()
    获取恒定版本。如果您需要一个非常量版本,请将其放入一个字符向量(可以用两个迭代器初始化)并传递
    &v[0]
    v.data()

    2:
    NULL
    应该可以工作,因为它是一个
    wchar\u t*
    (假设为Windows API数据类型)。如果您有C++11,请改用
    nullptr

    3:
    memset
    对于任何非POD类来说都是一个糟糕的主意。如果您没有构造函数,将为您提供一个默认构造函数,默认构造函数初始化所有非平凡的可构造成员。如果您有
    int
    等未初始化的成员,最好输入您自己的成员:

    std::string s; //empty
    
    struct S {
        int i;
        std::string s; //non-trivially constructible, so default-initialized
    };
    
    S s;
    
    在上面的示例中,您将得到一个空字符串和未初始化的
    int
    。这就是为什么你自己的通常更好:

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

    你能发布一些代码来演示你在做什么,以及抛出探查器错误的行吗?我已经将它们添加到了最初的发布中。谢谢@linuxdeveloper,只是想知道,
    LPWSTR
    (和
    WriteFile
    )是从哪里来的?我不知道Linux中有这样的东西,但似乎您使用的
    hid\u设备是,除非您在应用程序中本地定义了它。是的,Linux内核中没有使用它们。相反,通过使用vc++构建的宿主应用程序,您可以发布一些代码来演示您正在做的事情以及引发探查器错误的行吗?我已将它们添加到初始发布中。谢谢@linuxdeveloper,只是想知道,
    LPWSTR
    (和
    WriteFile
    )是从哪里来的?我不知道Linux中有这样的东西,但似乎您使用的
    hid\u设备是,除非您在应用程序中本地定义了它。是的,Linux内核中没有使用它们。而是由使用vc++Hmm构建的主机应用程序来实现,为什么不使用v.front()?我一直都是这么用的。嗯,为什么不是v.front()?我一直都是这么用的。