Torna indietro   Hardware Upgrade Forum > Software > Programmazione

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
ASUS Expertbook PM3: il notebook robusto per le aziende
ASUS Expertbook PM3: il notebook robusto per le aziende
Pensato per le necessità del pubblico d'azienda, ASUS Expertbook PM3 abbina uno chassis particolrmente robusto ad un pannello da 16 pollici di diagonale che avantaggia la produttività personale. Sotto la scocca troviamo un processore AMD Ryzen AI 7 350, che grazie alla certificazione Copilot+ PC permette di sfruttare al meglio l'accelerazione degli ambiti di intelligenza artificiale
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo
Abbiamo provato per diversi giorni una new entry del mercato italiano, la Gowow Ori, una moto elettrica da off-road, omologata anche per la strada, che sfrutta una pendrive USB per cambiare radicalmente le sue prestazioni
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


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...
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design   Recensione OnePlus 15: potenza da vendere e batt...
AMD Ryzen 5 7500X3D: la nuova CPU da gaming con 3D V-Cache per la fascia media AMD Ryzen 5 7500X3D: la nuova CPU da gaming con ...
Realme GT 8 Pro: ecco la Dream Edition r...
'Vibe coding? Sì, ma non toccate ...
Cloudflare si scusa e spiega cos'è...
Obbligati ad acquistare una scheda madre...
GTA VI su PC? La data non c'è, ma...
Monopattini elettrici, a un anno dal dec...
Tesla Robotaxi, autista di sicurezza si ...
Samsung Galaxy S26: svelate le combinazi...
Microsoft Ignite: arriva Edge for Busine...
OPPO e Lamine Yamal uniscono sport e tec...
Microsoft, NVIDIA e Anthropic siglano un...
SpaceX potrebbe comunicare alla NASA rit...
Scoperte cavità sotterranee scava...
OnePlus anticipa l'arrivo di due nuovi p...
DJI lancia Osmo Action 6: la prima actio...
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: 07:28.


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