Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve
Dopo quasi un mese di utilizzo quotidiano e un viaggio medio-lungo in autostrada, raccontiamo pregi e limiti della Geely EX5: comfort premium, batteria LFP da 60,22 kWh, autonomia fino a 430 km e un prezzo che parte da 38.900 €
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare
Mova Z70 Ultra Complete è un robot aspirapolvere che coniuga un'aspirazione potente e un lavaggio con rullo a logica di intelligenza artificiale che guida al meglio nella pulizia di casa: rulli e spazzole estensibili a pulire gli angoli e una base di ricarica che lava e ripristina il robot al emglio delle sue funzionalità dopo ogni azione di pulizia
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-12-2019, 12:37   #1
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
[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;
    }
}
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2019, 15:49   #2
lorenzo001
Senior Member
 
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
Ti hanno risposto su html.it
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2019, 20:26   #3
Lampo89
Member
 
L'Avatar di Lampo89
 
Iscritto dal: Dec 2006
Messaggi: 33
Quote:
Originariamente inviato da lorenzo001 Guarda i messaggi
Ti hanno risposto su html.it
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.
Lampo89 è offline   Rispondi citando il messaggio o parte di esso
Old 22-12-2019, 12:14   #4
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Quote:
Originariamente inviato da lorenzo001 Guarda i messaggi
Ti hanno risposto su html.it

Quote:
Originariamente inviato da Lampo89 Guarda i messaggi
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)
Grazie per la risposta e per il suggerimento di godbolt...
C'é poco da fare... C e C++ sono quelli con l'assembly piú stringato possibile
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Recensione Google Pixel 11: non ha l'HiLight dei Pro, ma è il Pixel più equilibrato di sempre Recensione Google Pixel 11: non ha l'HiLight dei...
Google Pixel 11 Pro XL: fotocamera al top, batteria indietro. Luci e ombre del nuovo flagship Google Pixel 11 Pro XL: fotocamera al top, batte...
Finiscono gli incentivi, crollano le ven...
Lo specchio M4 dell'Extremely Large Tele...
Un PC ricondizonato a prezzo super, perf...
TP-Link annuncia la prima gamma di dispo...
Google Pics sfida Canva con l'intelligen...
Blue Origin si aggiudica il contratto de...
Astra hackera meglio di un esperto umano...
Memorie 3D, AMD vede un possibile futuro...
Sparkle e Hellas Sat sperimentano con su...
Toyota propone un approccio 'ibrido' anc...
Huawei annuncia la serie Watch GT 7: sci...
Sonos 27 porta l'IA nel sistema audio di...
Quella solare è ufficialmente la ...
Sony WH-1000XM6 in offerta a 349€ in tut...
Sony introduce una nuova politica contro...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:16.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v