sbi tenía la mejor respuesta para arreglos simples, pero no daba un ejemplo. Así que ...
Debe utilizar la colocación de nuevo:
char *place = new char [sizeof(Foo) * 10000];
Foo *fooArray = reinterpret_cast<Foo *>(place);
for (unsigned int i = 0; i < 10000; ++i) {
new (fooArray + i) Foo(i); // Call non-default constructor
}
Tenga en cuenta que cuando se utiliza la colocación nueva, que es responsable de llamar destructores de los objetos - el compilador no hacerlo para ti:
// In some cleanup code somewhere ...
for (unsigned int i = 0; i < 10000; ++i) {
fooArray[i].~Foo();
}
// Don't forget to delete the "place"
delete [] reinterpret_cast<char *>(fooArray);
Esta es la única vez que ves una llamada explícita legítima a un destructor.
NOTA: La primera versión de esto tenía un error sutil al eliminar el "lugar". Es importante volver a colocar el "lugar" en el mismo tipo que se renovó. En otras palabras, fooArray
debe volver a fundirse al char *
al eliminarlo. Vea los comentarios a continuación para una explicación.
Por favor, no concluir a partir de las respuestas que usted no puede hacer referencia a la matriz si no inicializa de inmediato. Siempre puede hacer 'extern Foo foo [100];' y luego ya hacer referencia a la matriz, siempre y cuando la defina y * luego * necesite todos los inicializadores :) –
Dagnammit, escribí el mismo comentario sobre 'extern ', pero pensé que debería comprobar que realmente funciona antes de publicar, y tú me ganaste.No creo que necesite siquiera definirlo, siempre y cuando no lo haga referencia. –
¿Por qué declarar una matriz y no un vector? –