No puede hacerlo en una línea fácilmente. Que puede hacer:
char* c = new char[length];
memset(c, 0, length);
O bien, puede sobrecargar el nuevo operador:
void *operator new(size_t size, bool nullify)
{
void *buf = malloc(size);
if (!buf) {
// Handle this
}
memset(buf, '\0', size);
return buf;
}
entonces usted será capaz de hacer:
char* c = new(true) char[length];
mientras
char* c = new char[length];
mantendrá el viejo comportamiento. (Tenga en cuenta que si quiere que todos los new
s pongan a cero lo que crean, puede hacerlo utilizando el mismo anterior pero eliminando la parte bool nullify
).
Tenga en cuenta que si elige la segunda ruta, debe sobrecargar el nuevo operador estándar (el que no tiene bool) y el operador de eliminación también. Esto es porque aquí está usando malloc()
, y el estándar dice que las operaciones malloc()
+ delete
no están definidas. Por lo tanto, debe sobrecargar delete
para usar free()
y la versión nueva normal para usar malloc()
.
Aunque en la práctica todas las implementaciones utilizan malloc()/free() internamente, por lo que incluso si usted no lo hace más probable es que no tenga algún problema (excepto los abogados de lengua gritando en usted)
Wow .. esto resulta ser una gran pregunta. Mucha gente que no sabe de std :: fill_n parece. – Draemon
Solo para que quede constancia, no estoy completamente al tanto de 'std :: fill_n', es solo que lo ignoro en su mayoría, y solo uso algoritmos n cuando es necesario. Es entonces cuando el tipo de iterador no admite 'operator +', y 'std :: advance' podría ser ineficiente. Ninguna de esas condiciones es verdadera de punteros. –