Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Con la prima rete 5G Standalone attiva in Italia, WINDTRE compie un passo decisivo verso un modello di connettività intelligente che abilita scenari avanzati per imprese e pubbliche amministrazioni, trasformando la rete da infrastruttura a piattaforma per servizi a valore aggiunto
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro punta a diventare uno dei riferimenti assoluti nel segmento dei camera phone di fascia alta. Con un teleobiettivo Hasselblad da 200 MP, una batteria al silicio-carbonio da 7500 mAh e un display da 6,78 pollici con cornici ultra ridotte, il nuovo flagship non teme confronti con la concorrenza, e non solo nel comparto fotografico mobile. La dotazione tecnica include il processore MediaTek Dimensity 9500, certificazione IP69 e un sistema di ricarica rapida a 80W
DJI Romo, il robot aspirapolvere tutto trasparente
DJI Romo, il robot aspirapolvere tutto trasparente
Anche DJI entra nel panorama delle aziende che propongono una soluzione per la pulizia di casa, facendo leva sulla propria esperienza legata alla mappatura degli ambienti e all'evitamento di ostacoli maturata nel mondo dei droni. Romo è un robot preciso ed efficace, dal design decisamente originale e unico ma che richiede per questo un costo d'acquisto molto elevato
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 14-07-2008, 20: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, 20: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, 20: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, 23: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, 19: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


Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
DJI Osmo Nano: la piccola fotocamera alla prova sul campo DJI Osmo Nano: la piccola fotocamera alla prova ...
FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Samsung lancia il Team Galaxy Italia per...
Magic Leap: indistinguibili dai normali ...
Aruba Cloud: trasparenza sui costi e str...
Quando il cloud si blocca e resti al fre...
Integrare per competere, la sfida digita...
Leggenda del rally e modernità: S...
La Python Software Foundation rinuncia a...
Full HD e QLED, è in offerta un TV da 32...
Honda ha rilasciato un nuovo video sul p...
Resident Evil Requiem: arriva su Switch ...
Marshall Acton III in promo su Amazon in...
2 portatili che costano poco ma vanno be...
Smartphone potenti sotto i 300€: ecco i ...
28 Offerte Amazon da non perdere: smartp...
X torna a crescere in Europa: +7 milioni...
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: 17:36.


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