我有一个关于new / delete运算符与alloc / free相比的问题。
当动态地为char *分配内存时,我通常使用calloc,所以所有保留位都设置为零,所以我不必费心无效。
char * string = new char [20]是否仅保留20个具有char大小的项目,还是将该memoryarea中的所有位设置为零?
如果没有,可以在此内存上使用memset来实现这一目标吗? 如果memset或任何其他可能将分配的内存归零的方法,那么新的运算符是否可以为本机char类型重载以独立完成这项工作?
答案 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
。