PDA

Visualizza la versione completa : [C++] ofstream distrutto all'uscita della funzione


VegetaSSJ5
21-12-2019, 14:30
Salve a tutti, mi sto cimentando con il C++ e sto facendo alcuni esercizi. Mi trovo a realizzare un piccolo esempio: costruire un vector di ostream e, attraverso una funzione mandare una stringa in tutti gli ostream del vettore. Ho quindi una funzione che costruisce questo vector di (puntatori a) ostream e lo inizializza inserendovi &cout e un &file. Se ciclo il vettore all'interno della funzione, i messaggi vengono correttamente riportati in tutti gli ostream, ma uscito dalla funzione e tornato al chiamante, l'output su cout viene correttamente riportato, ma l'output sull'ofstream su file invece genera un errore a me ancora abbastanza incomprensibile. Come se, all'uscita della funzione, quel puntatore a ostream presente nel vettore non fosse piú valido.
Segue il codice sorgente compilabile e con stesso errore sia su compilatore ms (VS2019) sia su gcc. Potete dirmi per favore cosa c'é di concettualmente sbagliato?

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

vector<ostream*> createStreams(const string& fileName) {
vector<ostream*> result;
result.push_back(&cout);
ofstream lFile(fileName, ofstream::app);
result.push_back(&lFile);
for (ostream* ostr : result) {
*ostr << "TEST in createStream function" << endl;
}
return result;
}

int main() {
try {
vector<ostream*> ostreams = createStreams("C:\\Users\\Armando\\Desktop\\testlog.txt");
for (ostream* ostr : ostreams) {
*ostr << "TEST in main function" << endl;
}
} catch (exception& e) {
cerr << "Catched exception in main method: " << e.what() << endl;
}
}

oregon
21-12-2019, 17:44
Codice corretto ...



vector<ostream*> *createStreams(const string& fileName) {
vector<ostream*> *result = new vector<ostream*>;
result->push_back(&cout);
ofstream *lFile = new ofstream(fileName, ofstream::app);
result->push_back(lFile);
for (ostream* ostr : *result) {
*ostr << "TEST in createStream function" << endl;
}
return result;
}


int main() {
try {
vector<ostream*> *ostreams = createStreams("C:\\Users\\Armando\\Desktop\\testlog.txt");
for (ostream* ostr : *ostreams) {
*ostr << "TEST in main function" << endl;
}

// Distruzione oggetto ostreams ... attenzione agli oggetti allocati all'interno ....
}
catch (exception& e) {
cerr << "Catched exception in main method: " << e.what() << endl;
}

return 0;
}

VegetaSSJ5
22-12-2019, 14:07
Grazie mille oregon! :)
Alla fine, cercando modalitá alternative di fare la stessa cosa, sono arrivato anch'io alla soluzione che tu hai proposto, dimenticando peró la deallocazione degli oggetti puntati (:shy:). Chiedo venia per le "sciocchezze" che si possono scrivere quando si comincia a muovere i primi passi in un ambiente nuovo.

Buone feste! :)

Loading