2011-04-12 3 views
0

J'ai ce problème avec l'allocation d'un tableau de certains objets que j'ai besoin d'initialiser avec un constructeur. Permettez-moi de montrer ce que je veux dire:C++ alloc tableau d'objets

ofstream* out = new ofstream[10]; 

for(int i = 0; i < 10; i++){ 
    stringstream ss; 
    ss << "file" << i << ".txt"; 
    string str(ss.str()); 
    char *fileName = (char*)str.c_str(); 
    out[i] = ofstream(fileName); //Now, this is wrong 
} 

Et je besoin d'aide sur la wrong ligne marquée. Comment attribuer chaque membre de ce tableau?

Et je vous remercie de ne pas me pointant vers d'autres postes (j'ai regardé beaucoup avant de poster)

+0

'out' est sensible à une fuite de mémoire. N'oubliez pas d'appeler 'delete []'. –

+0

l'a fait, merci :) –

Répondre

5

Débarrassez-vous de la variable fileName et utiliser out[i].open(str.c_str()); - et souvenez-vous delete[] out;

+0

est-ce que 'delete []' appelle aussi 'close()' sur chaque flux de mon tableau? –

+1

@iuliux: delete [] assurera que le destructeur de chaque flux est appelé - ce qui le ferme. – Erik

+0

Cool. Alors laissez votre réponse être l'élu, bien que @Chris Kaminski ait aussi bien répondu –

5

Voici la solution la plus simple ton problème.

out[i].open(fileName); 
2

Vous pouvez optimiser ce, avec la suppression str et fileName:
out[ i ].open(ss.str().c_str());

De plus, je vous recommande l'utilisation yo std::vector de ne pas porter sur l'allocation de mémoire et désallocation.
std::vector<std::ofstream>

+0

Eh bien, j'ai lu plus tôt pourquoi 'ss.str(). C_str()' ne fonctionne pas. Les gars disaient que 'ss.str' génère un objet temporaire. –

+0

Huh? C'est étrange O.o Je ne vois rien de mal à ça - oui, '.str()' retourne l'objet temp, mais quoi? C'est toujours "live" lors de l'ouverture du fichier (stream). –

+0

Je viens de lancer ceci sur Visual Studio 2010 et il n'y a pas d'avertissements, ça marche très bien:? –

2

Si vous avez vraiment besoin d'appeler le constructeur au moment où vous insérez l'élément (peut-être parce que votre classe n'a pas de constructeur par défaut), essayez le placement nouveau comme décrit ici http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.5

+0

Super, merci .. –