3

与 alloc/free 相比,我对 new/delete 运算符有疑问。

当为 char* 动态分配内存时,我通常使用 calloc,因此所有保留位都设置为零,因此我不必为 null 终止而烦恼。

char *string = new char[20] 是否仅保留 20 个具有 char 大小的项目,或者它是否还将该内存区域中的所有位设置为零?

如果不能,可以在此内存上使用 memset 来实现吗?如果 memset 或任何其他将分配的内存清零的方法是可能的,是否可以为本地 char 类型重载 new 运算符以自行完成这项工作?

4

3 回答 3

6

当您使用:

string = new char[20];

分配的数组未初始化。为了默认初始化它,您必须使用:

string = new char[20]();  // Allocates and initializes all members to 0

这在 C++03 §5.3.4/15 中有说明:

创建 T 类型对象的 new 表达式按如下方式初始化该对象: ...

如果 new-initializer 为 () 形式,则该项为值初始化 (8.5);

至于你的第二个问题——是的,你可以用memset你想要的任何值来填充内存。

于 2013-01-08T17:26:52.867 回答
1

char * string = new char[20]将在分配内存之前填充已分配内存中的任何内容。

您可以将数组 memset 为 0 以实现您想要的。

char * string = new char[20];
memset(string, 0x00, sizeof(char) * 20);

覆盖 new 也可以做到这一点。

void* operator new(size_t n){
   void * mem = malloc(n);
   memset(mem, 0x00, n);
   return mem;
}
于 2013-01-08T17:23:40.527 回答
1

new不对原始类型(如char)进行零初始化。使用memset很好,但惯用的 C++ 方法是使用std::fill

std::fill(string, string+length, 0);

当然,如果你想要一个字符串,那么你应该只std::string在 C++ 中使用 a 。

于 2013-01-08T17:23:57.027 回答