【问题标题】:Initializing char buffer in c++在 C++ 中初始化字符缓冲区
【发布时间】:2023-04-02 14:10:01
【问题描述】:

我正在使用 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;

仍然没有帮助。

【问题讨论】:

  • 您能否发布一些代码来演示您正在做什么以及引发分析器错误的行?
  • 我已将它们添加到初始发布中。谢谢!!!
  • @linuxdeveloper,只是想知道,LPWSTR(和WriteFile)来自哪里?我知道 Linux 中没有这样的东西,但您使用的 hid_device 似乎是,除非您在应用程序中本地定义它。
  • 是的,它们没有在 linux 内核中使用。而是由使用 vc++ 构建的主机应用程序

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


【解决方案1】:

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

【讨论】:

  • 嗯,为什么不用 v.front()?这就是我一直使用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
相关资源
最近更新 更多