PDA

View Full Version : [C++ - DLL]Plugins e distruzione oggetti


The3DProgrammer
17-03-2008, 13:35
Salve a tutti, sto realizzando un semplice sistema a plugins per la mia applicazione. Il sistema è implementato in questo modo:

Ho definito 2 classi astratte, PluginBase e PluginProxy, i cui headers sono presenti all'interno dell'eseguibile. Per creare un plugin è sufficiente creare una DLL che esporti un metodo GetPluginProxy() il quale ritorna un puntatore ad un'istanza di una sottoclasse di PluginProxy. PluginProxy mette a disposizione un metodo GetPluginInstance() per ottenere un riferimento ad un'istanza di una sottoclasse di PluginBase. Ora mi sorge un dubbio: sono sicuro di aver letto da qualche parte che non è bene deallocare nell'eseguibile memoria allocata tramite chiamata ad una funzione presente in una DLL. Ora non ricordo dove l'ho letto, e non riesco a trovare nulla sul web. E benchè possa immaginare alcuni possibili problemi che potrebbero sorgere, non sono del tutto convinto. Avete maggiori info in proposito? Dove posso trovare dettagli riguardanti le convenzioni da seguire nella "comunicazione" tra DLL ed eseguibile?

fek
17-03-2008, 14:10
DLL e EXE usano heap diversi, e possono essere scritti in linguaggi diversi con allocatori diversi e usare layout degli oggetti diversi. Insomma, hai capito il problema.

COM e' nato per risolvere questo problema, .NET e' la sua evoluzione sulla strada della soluzione esattamente del tuo problema.

Come immagini non e' un problema semplice, stai praticamente tentando di riscrivere COM :)

La regola alla quale ti devi ottenere e': il processo (in questo caso la DLL) che alloca memoria (in questo caso un oggetto) deve occuparsi della sua distruzione.

In realta' questo e' un paradigma C++ piu' generale che andrebbe sempre seguito, chiamato RAII (Resource Acquisition Is Initialisation) che recita: chi acquisice una risorsa deve occuparsi della sua distruzioni. In altre parole l'entita' che ha l'ownership o crea una risorsa deve sempre occuparsi della sua distruzione.

Aggiungi un metodo virtuale non inline Release all'interfaccia del plugin che esegue semplicemente:


void Plugin::Release()
{
delete this;
}

The3DProgrammer
17-03-2008, 14:47
perfetto grazie ;)

Ricordavo del paradigma RAII, ma nn mi veniva in mente il nome :D so un po arrugginito col C++, ca*o di java

ps come ti sembra il design?

fek
17-03-2008, 15:06
perfetto grazie ;)

Ricordavo del paradigma RAII, ma nn mi veniva in mente il nome :D so un po arrugginito col C++, ca*o di java

ps come ti sembra il design?

Non ci proverei nemmeno e passerei a .NET ;)

The3DProgrammer
17-03-2008, 19:53
ahah touchè :p

ci penserò nei prossimi lavori :)

71104
18-03-2008, 01:13
Aggiungi un metodo virtuale non inline Release all'interfaccia del plugin che esegue semplicemente: se è virtuale non può essere inline