Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-12-2019, 13: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, 16: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, 21: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 21:33.
Lampo89 è offline   Rispondi citando il messaggio o parte di esso
Old 22-12-2019, 13: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


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Numeri record per Valve: è lei l'...
Samsung Galaxy S26 Ultra: la batteria no...
Realme GT 8 Pro arriva in Italia: ecco i...
Mercato GPU Q3 2025: crescita moderata, ...
Amazon Leo Ultra: l'antenna per navigare...
Thales Alenia Space: siglati i contratti...
La NATO si affida a Google Cloud per il ...
Blue Origin ha mostrato il lander lunare...
AMD comunica gli aumenti di prezzo delle...
Leapmotor smepre più aggressiva: ...
PLD Space annuncia i progressi del razzo...
Il record indesiderato che la nuova Fiat...
Una nave a fusione nucleare entro il 203...
OnePlus 15 R, Pad Go 2 e Watch Lite: tut...
Monitor gaming QHD a meno di 110 euro: p...
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: 08:25.


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