【发布时间】:2013-05-28 03:36:55
【问题描述】:
我有一个问题。
我在 ASIO 中开发服务器,数据包是尖字符。
当我创建新字符(例如char * buffer = new char[128];)时,我必须手动将其清除为空值。
作者:
for(int i =0;i<128;i++)
{
buffer[i] = 0x00;
}
我做错了什么,那个字符不清楚?
【问题讨论】:
我有一个问题。
我在 ASIO 中开发服务器,数据包是尖字符。
当我创建新字符(例如char * buffer = new char[128];)时,我必须手动将其清除为空值。
作者:
for(int i =0;i<128;i++)
{
buffer[i] = 0x00;
}
我做错了什么,那个字符不清楚?
【问题讨论】:
在 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
【讨论】:
您不必遍历未初始化值的数组。您可以像这样动态实例化零数组:
char * buffer = new char[128](); // all elements set to 0
^^
【讨论】:
分配的内存不会被清除,它会包含随机的东西。这就是内存分配的工作原理。您必须运行 for-loop 或使用 memset 手动清除它。
【讨论】: