Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Nothing Phone (4a) Pro cambia pelle: l'alluminio unibody sostituisce la trasparenza integrale, portando una solidità inedita. Sotto il cofano troviamo uno Snapdragon 7 Gen 4 che spinge forte, mentre il display è quasi da top dig amma. Con un teleobiettivo 3.5x e la Glyph Matrix evoluta, è la prova di maturità di Carl Pei. C'è qualche compromesso, ma a 499EUR la sostanza hardware e la sua unicità lo rendono un buon "flagship killer" in salsa 2026
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro
Con Midnight, Blizzard tenta il colpaccio: il player housing sbarca finalmente su Azeroth insieme a una Quel'Thalas ricostruita da zero. Tra il dramma della famiglia Ventolesto e il nuovo Prey System, ecco com'è la nuova espansione di World of Warcraft
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Nuova frontiera per i robot tagliaerba, con Ecovacs GOAT O1200 LiDAR Pro che riconosce l'ambiente in maniera perfetta, grazie a due sensori LiDAR, e dopo la falciatura può anche rifinire il bordo con il tagliabordi a filo integrato
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 14-07-2008, 19:00   #1
Johnn
Senior Member
 
Iscritto dal: May 2004
Messaggi: 1136
[C++] RAII e ereditarietà: è corretta questa architettura?

Per un progetto universitario devo realizzare in c++ una cosa del genere (in realtà le classi figlie sono di più ma il concetto non cambia):



Ovviamente devo gesitre opportunamente le deallocazioni degli oggetti creati dinamicamente. Il problema è che molte delle classi figlie sono dipendenti tra loro ed hanno metodi che istanziano nuovi oggetti, ne modificano di già esistenti, ecc. In altre parole chi alloca non può deallocare un certo oggetto.
Per avere comunque una opportuna deallocazione della memoria non più in uso, ho letto in rete dell'idioma RAII e anche degli smart pointer. Vorrei evitare l'uso di quest'ultimi, ma penso sia adatta l'architettura seguente:



che ho adattato da questo esempio:

Codice:
class WindowManager {
    private:
        Window* w;
    public:
        WindowManager() {
            w = WindowFactory::createWindow();
        }
        Window* getWindow() {
            return w;
        }
        ~WindowManager() {
            delete w;
        }
}
class TestWindow {
    void disegna() {
        WindowManager m;
        Window* w = m.getWindow();
        /* utilizza w... */
    } /* ora m è out of scope: w è deallocata */
}
preso da qui:

http://programminghacks.wordpress.com/category/c/

L'idea è che le classi A, B, ecc. hanno costruttori privati e quindi possono essere istanziate solo con le rispettive classi Manager: saranno queste che istanziate staticamente allocheranno e distruggeranno gli oggetti in maniera praticamente automatica.

Ovviamente se prima il codice di un metodo era ad esempio:

Codice:
...
return new B(this->getAttribute());
Ora dovrà essere:

Codice:
...
Manager b;
b.createB(this->getAttribute());
return b.getInstance();

Ho sbagliato qualcosa?

Grazie.
Johnn è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2008, 19:33   #2
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
Iscritto dal: Nov 2005
Messaggi: 1545
Non ti basta usare auto_ptr?
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2008, 19:40   #3
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
Iscritto dal: Nov 2005
Messaggi: 1545
La tua architettura presenta comunque un po' di problemi.

Cosa succede con questo codice?

Codice:
void disegna(Application& app) {
    WindowManager m;
    Window* w = m.getWindow();
    delete w;
}
Cosa succede se passi w ad un oggetto come qui:
Codice:
 void disegna(Application& app) {
        WindowManager m;
        Window* w = m.getWindow();
        app.setWindow(w);
        /* utilizza w... */
    }
Pensa poi cosa succederebbe se facessi una copia della factory
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
Old 14-07-2008, 22:44   #4
Johnn
Senior Member
 
Iscritto dal: May 2004
Messaggi: 1136
Per quanto riguarda auto_ptr:
quando ho cercato in rete la soluzione al mio problema ovviamente mi ci sono imbattutto. Spesso è consigliato usare soluzioni più evolute che si appoggiano a librerie esterne (boost per esempio); ma come ho detto il mio codice è per un progetto universitario e aggiungo che la corretta deallocazione della memoria non è tra gli obiettivi principali (può sembrare strano ma ci sono diverse ragioni che non sto qui a spiegare). Per questo non ho voluto usare cose troppo potenti (penso che la soluzione corretta sia usare "i reference-counting smart pointer (RCSP), che tengono traccia del numero di puntatori alla risorsa gestita e permettono di garantire una garbage collection per una particolare risorsa. In C++ gli RCSP coincidono con std::tr1::shared_ptr<T>.") o che necessitino di includere librerie non standard. auto_ptr (so che è standard, ma avevo letto che era poco potente, ecc.) e l'ho scartato.

Tuttavia su tuo consiglio ho riletto qualcosa su come si usa e il problema per l'uso che ne devo fare io penso sia:

"If an auto_ptr is copied, the source loses the reference." (Wikipedia)

Quindi penso che comunque non lo possa usare, in quanto gli oggetti del mio programma sono spesso condivisi tra loro, passati come parametri ad altri costruttori/metodi. Giusto?

Per la seconda parte del post:
ho usato l'esempio che ho postato solo per trarne spunto, non devo fare Window o simili (perché hai usato come parametro del metodo "Application& app"?);
per questo:
Codice:
void disegna(Application& app) {
    WindowManager m;
    Window* w = m.getWindow();
    delete w;
}
forse il problema non c'è in quanto la delete nei metodi delle classi non metto mai (perché dovrei?); nel main, o chi usasse le mie classi, teoricamente potrebbe essere fatto, ma posso tranquillamente assumere che non accada mai.

Per quast'altro
Codice:
 void disegna(Application& app) {
        WindowManager m;
        Window* w = m.getWindow();
        app.setWindow(w);
        /* utilizza w... */
    }
la situazione è effettivamente delicata.

Intanto riporto l'esempio in uno scenario più simile al mio:

Codice:
 Abstract* /*Puntatore di tipo della classe astratta padre di ogni altra classe A, B, ecc.*/ method(B ib) {
        ManagerA m;
        A* ia = m.getInstance();
        ia->setAttribute(ib);
        this->setAttribute3(ia);
        return this;
    }
Il guaio è che la classe manager può deallocare la classe gestita mentre essa è puntata da qualche altra parte, vero? Bel problema.

Il quesito che mi ha fatto fare tutto ciò è che mi sono chiesto se in c++ sia possibile risparmiare memoria facendo puntare ad una stessa area di memoria più puntantori invece di creare sempre nuovi oggetti (il problema non si avrebbe a questo punto, sempre che gli oggetti condivisi siano effettivamente identici) e deallocare opportunamente il tutto, ma pare impossibile senza usare garbage collector o smart pointer.

Grazie mille ancora.
Johnn è offline   Rispondi citando il messaggio o parte di esso
Old 17-07-2008, 18:00   #5
Johnn
Senior Member
 
Iscritto dal: May 2004
Messaggi: 1136
Dati i problemi incontrati fino ad ora, sto optando per l'uso di un garbage collector. Più precisamente uso questo:

http://www.hpl.hp.com/personal/Hans_Boehm/gc/
Johnn è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico Recensione Nothing Phone (4a) Pro: finalmente in...
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti Zeekr X e 7X provate: prezzi, autonomia fino a 6...
L'Intelligenza Artificiale ora può...
Il data center del futuro secondo Huawei...
Spesa a domicilio senza conducente: robo...
Satoshi Nakamoto ha finalmente un volto?...
La Corea del Sud taglia fuori i bus elet...
GoPro taglia ancora: licenziato il 23% d...
Muse S Athena: la fascia che ti legge ne...
PS5 Pro e PSSR 2.0: tutti i giochi compa...
Dimensity 9600 Pro promette prestazioni ...
BMW i7 2026 adotta celle cilindriche Gen...
Cyberpunk 2077 si aggiorna su PS5 Pro co...
Valve porta Steam Link su Vision Pro per...
Google Maps: ufficiali 3 novità c...
TikTok punta tutto sull'Europa: un milia...
OnePlus Nord 6 ufficiale: arriva con una...
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: 19:04.


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