快速开启新/删除和分配/免费

时间:2013-01-08 17:20:57

标签: c++

我有一个关于new / delete运算符与alloc / free相比的问题。

当动态地为char *分配内存时,我通常使用calloc,所以所有保留位都设置为零,所以我不必费心无效。

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

如果没有,可以在此内存上使用memset来实现这一目标吗? 如果memset或任何其他可能将分配的内存归零的方法,那么新的运算符是否可以为本机char类型重载以独立完成这项工作?

3 个答案:

答案 0 :(得分:5)

使用时:

string = new char[20];

分配的数组未初始化。要对其进行默认初始化,您必须使用:

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

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

  

创建类型为T的对象的new-expression初始化该对象,如下所示:   ...

     

如果new-initializer的格式为(),则该项为     value-initialized(8.5);

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

答案 1 :(得分:1)

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

您可以将数组memset设为0以达到您想要的效果。

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

覆盖新手也可以做到这一点。

void* operator new(size_t n){
   void * mem = malloc(n);
   memset(mem, 0x00, n);
   return mem;
}

答案 2 :(得分:1)

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

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

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