|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
[C++ - DLL]Plugins e distruzione oggetti
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? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
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: Codice:
void Plugin::Release() { delete this; }
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
perfetto grazie
![]() Ricordavo del paradigma RAII, ma nn mi veniva in mente il nome ![]() ps come ti sembra il design? |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
![]()
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
ahah touchè
![]() ci penserò nei prossimi lavori ![]() |
![]() |
![]() |
![]() |
#6 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:55.