|
|
|
|
Strumenti |
21-12-2019, 12:37 | #1 |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9219
|
[C++] ofstream distrutto all'uscita della funzione
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? Codice:
#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; } } |
21-12-2019, 15:49 | #2 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 541
|
Ti hanno risposto su html.it
|
21-12-2019, 20:26 | #3 |
Member
Iscritto dal: Dec 2006
Messaggi: 33
|
https://forum.html.it/forum/showthre...readid=2971976
Come hai notato, il tuo vettore contiene un "dangling pointer" poiché l'oggetto ofstream è una variabile locale con "automatic storage duration". Di conseguenza, dato che essa è distrutta all'uscita della funzione CreateStreams, dereferenziando il puntatore otterrai undefined behaviour (se vuoi https://godbolt.org/ qui puoi vedere come varia il comportamento al variare del compilatore e dei flags di compila). La soluzione che ti hanno dato su html.it risolve questo problema, ma ha un paio di memory leaks (vector e ofstream) da sistemare (come da commento nel codice) Ultima modifica di Lampo89 : 21-12-2019 alle 20:33. |
22-12-2019, 12:14 | #4 | |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9219
|
Quote:
C'é poco da fare... C e C++ sono quelli con l'assembly piú stringato possibile |
|
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:24.