Ho una classe astratta nella mia DLL.Uso di shared_ptr nelle interfacce dll
class IBase {
protected:
virtual ~IBase() = 0;
public:
virtual void f() = 0;
};
voglio ottenere IBase
nel mio file exe che carica dll. primo modo è quello di creare seguente funzione
IBase * CreateInterface();
e di aggiungere la funzione virtuale Release()
in IBase
.
secondo modo è quello di creare un'altra funzione
boost::shared_ptr<IBase> CreateInterface();
e non è necessaria alcuna funzione Release()
.
Domande.
1) E 'vero che la deallocazione distruttore e la memoria è chiamata nella DLL (non in exe-file) in secondo caso?
2) Il il secondo caso funziona bene se exe-file e dll sono stati compilati con diversi compilatori (o impostazioni diverse).
-1 perché * è possibile * associare l'eliminazione "destra" a shared_ptr e boost :: shared_ptr è già presente in tr1. Quindi è molto vicino a essere standard. +1 menzionare il nome di manomissione come un altro punto problematico = 0 ... e allora? – phlipsy
Che è possibile specificare un deleter personalizzato per l'utilizzo da shared_ptr non è il problema. Il problema è che lo "standard-to-be" (TR1) non specifica come deve essere implementato un shared_ptr, cioè quale dovrebbe essere il suo layout di memoria e dove dovrebbe memorizzare il suo conteggio dei riferimenti. La DLL e il client possono essere compilati con due compilatori che sono entrambi completamente conformi agli standard, ma non sono d'accordo su cosa sia shared_ptr internamente. *Questo è il problema. Quindi non usare shared_ptr nelle interfacce DLL ... potrebbe tornare indietro e morderti. –
@Marting: accetto, in entrambi i casi, il problema derivante da diverse implementazioni di shared_ptr non viene risolto dal deleter personalizzato. Ma poi la domanda di intestazione dovrebbe essere: è utile fornire un'interfaccia C++ per una DLL? – phlipsy