9

我有一个问题。

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

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

经过:

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

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

4

4 回答 4

22

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

char * buffer = new char[128](); // all elements set to 0
                             ^^
于 2013-06-01T11:22:34.360 回答
14

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

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

int * i = new int;

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

要 zeroinitialise(将设置为 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

这里有更多信息

于 2013-06-01T11:26:17.283 回答
3

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

于 2013-06-01T11:19:59.430 回答
2

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

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

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

于 2013-06-01T11:38:55.317 回答