Domanda

E 'valida per sviluppare una DLL in C ++ che restituisce spinta puntatori condivisa e li usa come parametri?

Quindi, è ok per esportare le funzioni in questo modo?

1.) boost::shared_ptr<Connection> startConnection();
2.) void sendToConnection(boost::shared_ptr<Connection> conn, byte* data, int len);

In particolare:? Funziona il conteggio di riferimento oltre i confini DLL o sarebbe il requisito di essere che EXE e DLL utilizzano lo stesso tempo di esecuzione

L'intento è quello di superare i problemi con la proprietà dell'oggetto. Così l'oggetto viene eliminato quando entrambi DLL e EXE non fanno riferimento più.

È stato utile?

Soluzione

Secondo Scott Meyers in Effective C ++ (3rd Edition), shared_ptrs sono sicuri attraverso i confini DLL. L'oggetto shared_ptr mantiene un puntatore al distruttore dalla DLL che lo ha creato.

  

Nel suo libro nel punto 18 afferma: "Una caratteristica particolarmente piacevole di   tr1 :: shared_ptr è che usa automaticamente la sua deleter per-pointer   per eliminare un altro errore potenziale cliente, il "problema di cross-DLL."   Questo problema pota in su, quando si crea un oggetto utilizzando di nuovo in uno   collegato dinamicamente library (DLL), ma viene eliminato in una DLL diversa. Sopra   molte piattaforme, come cross-DLL nuova / eliminare le coppie portano a runtime   errori. tr1 :: shared_ptr evitare il problema, perché la sua deleter di default   utilizza eliminare dalla stessa DLL in cui viene creato il TR1 :: shared_ptr ".

Tim Lesher ha un Gotcha interessante da guardare per, però, che egli cita qui . È necessario assicurarsi che la DLL che ha creato lo shared_ptr non viene scaricato prima che lo shared_ptr finalmente esce dallo scope. Direi che nella maggior parte dei casi questo non è qualcosa che si deve guardare per, ma se si sta creando dll che saranno debolmente accoppiati allora vi consiglio di non usare uno shared_ptr.

Un altro potenziale svantaggio è assicurarsi che entrambe le parti sono creati con le versioni compatibili della libreria Boost. shared_ptr di Boost è stato stabile per un lungo tempo. Almeno dal 1.34 è stato TR1 compatibili.

Altri suggerimenti

A mio parere, se non è nella norma e non è un oggetto / meccanismo previsto dalla vostra libreria, allora non dovrebbe essere parte dell'interfaccia alla libreria. È possibile creare il proprio oggetto per fare il conteggio di riferimento, e, forse, utilizzare aumentare sotto, ma non dovrebbe essere esplicitamente esposto nell'interfaccia.

DLL fanno le risorse normalmente non proprie - le risorse sono di proprietà dei processi che utilizzano la DLL. Lei è probabilmente meglio di restituire un puntatore semplice, che poi memorizzare in un puntatore condiviso sul lato di chiamata. Ma senza ulteriori informazioni è difficile essere sicuro al 100% su questo.

Qualcosa da ricerca di se si espone puntatori prime da un'interfaccia dll. Ti costringe a utilizzare il CRT DLL condivisa, la memoria allocata in una CRT non può essere deallocato in un CRT diverso. Se si utilizza il CRT DLL condivisa in tutti i moduli (dll & exe) allora si sta bene, tutti condividono lo stesso mucchio, se non vi sarà attraversando CRT e il mondo meltdown.

A parte questo problema, sono d'accordo con la risposta accettata. La fabbrica creazione probabilmente non dovrebbe definire la proprietà e la gestione del ciclo di vita per il codice del client.

No, non è.

Il layout di boost::shared_ptr<T> potrebbe non essere lo stesso su entrambi i lati del confine DLL. (Layout è influenzato da versione del compilatore, imballaggio pragma, e altre opzioni del compilatore, così come la versione attuale del codice sorgente Boost).

Solo "layout standard" (un concetto nuovo in C ++ 11, collegata ai vecchi concept "= Plain Old dati POD") tipi può tranquillamente essere passato tra i moduli separatamente costruiti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top