你如何初始化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] = {};
。