你如何初始化C + +中的dynamic数组?

我如何实现这个静态数组初始化的dynamic等价物:

char c[2] = {}; // Sets all members to '\0'; 

换句话说,创build一个dynamic数组,并将所有值初始化为终止字符:

 char* c = new char[length]; // how do i amend this? 
 char* c = new char[length](); 

两种方式:

 char *c = new char[length]; std::fill(c, c + length, INITIAL_VALUE); // just this once, since it's char, you could use memset 

要么:

 std::vector<char> c(length, INITIAL_VALUE); 

在我的第二种方式中,默认的第二个参数已经是0,所以在你的情况下是不必要的:

 std::vector<char> c(length); 

[编辑:为Fred的答案去投票, char* c = new char[length](); ]

也许使用std::fill_n()

 char* c = new char[length]; std::fill_n(c,length,0); 

C ++没有具体的function来做到这一点。 但是,如果使用std :: vector而不是数组(可能应该这样做),那么可以指定一个值来初始化向量。

 std::vector <char> v( 100, 42 ); 

创build一个大小为100的vector,所有值初始化为42。

new-expression的数组forms只接受一种forms的初始化程序:一个empty () 。 这个顺便说一句,和你的非dynamic初始化中的空{}有相同的效果。

你不能轻易在一行中完成。 你可以做:

 char* c = new char[length]; memset(c, 0, length); 

或者,您可以重载新运算符:

 void *operator new(size_t size, bool nullify) { void *buf = malloc(size); if (!buf) { // Handle this } memset(buf, '\0', size); return buf; } 

那么你将能够做到:

 char* c = new(true) char[length]; 

 char* c = new char[length]; 

会保持旧的行为。 (注意,如果你想让所有的new东西把他们创build的东西清零,你可以通过使用上面的方法来完成,但是取出bool nullify部分)。

请注意,如果select第二个path,则应该重载标准的new运算符(没有bool的运算符)和删除运算符。 这是因为在这里你使用的是malloc() ,而标准说malloc() + delete操作是未定义的。 所以你必须重载delete使用free() ,和正常的新使用malloc()

实际上,虽然所有的实现都是在内部使用malloc()/ free(),所以即使你不这样做也不会遇到任何问题(除了语言律师大吼你)

和许多海报隐含的评论=>不使用数组,使用向量。 没有任何缺点的数组的所有好处。 PLUS你得到很多其他的好东西

如果你不知道STL,请阅读Josuttis的C ++标准库和meyers有效的STL

没有内部手段,AFAIK。 使用这个:memset(c,0,length);

你必须“手动”初始化它:

 char* c = new char[length]; for(int i = 0;i<length;i++) c[i]='\0'; 

由于c ++ 11,我们可以使用列表初始化 :

 char* c = new char[length]{}; 

对于聚合types,将执行聚合初始化 ,它具有相同的效果,如char c[2] = {};