Torna indietro   Hardware Upgrade Forum > Software > Programmazione

NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine
Dopo anni di attesa e una lunga fase di sviluppo, Noctua entra nel mercato dei dissipatori a liquido AIO con la nuova serie NL-LC1. Forte dell'esperienza maturata nel raffreddamento ad aria, l'azienda austriaca promette di portare la propria filosofia fatta di qualità costruttiva, attenzione ai dettagli e silenziosità anche in questo segmento. Abbiamo provato il nuovo sistema per scoprire se riesce a distinguersi in un mercato ormai molto competitivo.
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super
Arrivato sul mercato italiano a fine marzo, la serie Boox Go 10.3 (Gen II) offre Android 15, penna da 4096 livelli e retroilluminazione opzionale (nel modello da noi provato, Lumi, presente). La serie si compone di due tablet ePaper che fanno da e-reader, blocco note digitale e persino browser, tutto a un prezzo che fa dimenticare i prodotti di brand più blasonati
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Pannello QD-OLED da 32 pollici con risoluzione 4K, frequenza di aggiornamento a 240Hz e tempi di risposta rapidissimi: il Gigabyte MO32U24 evolve il progetto del suo predecessore MO32U e alza ulteriormente l'asticella delle prestazioni. È ancora una volta un monitor indirizzato ai giocatori più esigenti
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


NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine NL-LC1 è il primo dissipatore a liquido A...
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con ...
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming Gigabyte MO32U24 OLED: il 4K a 240Hz su un panne...
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh Recensione realme 16 5G: lo smartphone con Selfi...
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni Come rispettare tutte le nuove regole per i mono...
Nuove regole per gli acquisti online: da...
I nuovi OPPO Reno 16 sono pronti al debu...
Prime Day anticipato, tutti i robot aspi...
Bug FIFA ai Mondiali 2026: chiunque avre...
Stop Killing Games bocciata: l'Europa no...
I costi dei 2 nm di TSMC potrebbero apri...
Prime Day Amazon, scope elettriche senza...
GTA 6 potrebbe registrare un numero impr...
Realme porta in Italia i nuovi P4x e P4 ...
456.000€ per una Leica militare in scato...
'Il mercato retail è quasi morto'...
Samsung Galaxy S27 Ultra, tre novit&agra...
Microsoft aggiorna la gamma Surface con ...
Xiaomi seguirà l'esempio di Apple: le te...
Uno studio su 588.000 lavoratori america...
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:51.


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