2010-03-18 12 views
19

De vez en cuando necesito llamar al new[] para los tipos incorporados (generalmente char). El resultado es una matriz con valores no inicializados y tengo que usar memset() o std::fill() para inicializar los elementos.¿Cómo puedo hacer `new []` default-initialize the array of primitive types?

¿Cómo puedo hacer new[] default-initialize the elements?

+7

No estoy seguro de si esto es válido, pero funciona bien en VC9. 'int * p = new int [10]();' – Naveen

Respuesta

25

int* p = new int[10]() debería hacer.

Sin embargo, como Michael points out, usar std::vector sería mejor.

+2

También puede la sintaxis de inicialización uniforme de C++ 11: 'new int [10] {}'. –

+2

@Fernando: Ahora puede, gracias por señalar esto. Sin embargo, hubieras tenido dificultades para encontrar un compilador que aceptara eso en mayo de 2010. ':)' – sbi

22

¿Por qué no solo usa std :: vector? Hará eso por ti, automáticamente.

 
std::vector<int> x(100); // 100 ints with value 0 
std::vector<int> y(100,5); // 100 ints with value 5 

También es importante tener en cuenta que el uso de vectores es mejor, ya que los datos se destruirán de forma fiable. Si tiene una declaración new[], y luego se lanza una excepción, los datos asignados se filtrarán. Si usa un std :: vector, se invocará el destructor del vector, causando que los datos sean desasignados apropiadamente.

+2

Estoy totalmente de acuerdo en que el vector es a menudo mejor, pero igual quiero nuevo []. +1 de todos modos. – sharptooth

1

Este tema relativamente antiguo ahora se puede mejorar con otra variante. que estaba usando bool, porque hay una especialización muy extraño para vector<bool>

#include <memory> 
... 
unique_ptr<bool[]> p{ new bool[count] {false} }; 

esto ahora se puede acceder con el operator[]

p[0] = true; 

igual std::vector<T> esto es seguro excepción.

(supongo que esto no era posible volver a 2010 :))