【问题标题】:C++ new * char aren't emptyC++ new * char 不为空
【发布时间】:2013-05-28 03:36:55
【问题描述】:

我有一个问题。

我在 ASIO 中开发服务器,数据包是尖字符。

当我创建新字符(例如char * buffer = new char[128];)时,我必须手动将其清除为空值。

作者:

for(int i =0;i<128;i++)
{
buffer[i] = 0x00;
}

我做错了什么,那个字符不清楚?

【问题讨论】:

标签: c++ pointers null char


【解决方案1】:

在 C++ 中有两种调用 new 运算符的方法 - 默认初始化和零初始化。

默认初始化(这将使值未定义)调用:

int * i = new int;

在设置之前读取或使用该值是未定义的行为。

要归零初始化(将设置为 0),请使用:

int * i = new int();

这也适用于数组:

int * i = new int[4]; // ints are not initialised, you must write to them before reading them
int * i = new int[4](); // ints all zero initialised

还有更多信息here

【讨论】:

    【解决方案2】:

    您也可以使用calloc。它自动将每个元素初始化为 0。 例如:

     char* buffer = (char *) calloc (128, sizeof (char))
    

    第一个参数是要分配的块数。其次是块的大小。 此函数返回 void*,因此您必须将其值转换为 (char *) 如果您使用 calloc(或 malloc 或任何“纯 c”分配函数),您最好使用 free 函数来释放内存而不是删除。

    【讨论】:

      【解决方案3】:

      您不必遍历未初始化值的数组。您可以像这样动态实例化零数组:

      char * buffer = new char[128](); // all elements set to 0
                                   ^^
      

      【讨论】:

        【解决方案4】:

        分配的内存不会被清除,它会包含随机的东西。这就是内存分配的工作原理。您必须运行 for-loop 或使用 memset 手动清除它。

        【讨论】:

          猜你喜欢
          • 2012-10-26
          • 1970-01-01
          • 2013-05-14
          • 2017-06-01
          • 2011-04-23
          • 1970-01-01
          • 2020-05-10
          • 2014-07-14
          • 1970-01-01
          相关资源
          最近更新 更多