Supponiamo che ho una classe Singleton S in una libreria statica, questo potrebbe essere collegato con le altre librerie dinamiche D1 D2 D3,classe Singleton in una libreria statica
Quindi, da quello che ho capito la classe S avrà un separato istanza in ogni D1, D2 e D3 e questo sarebbe vero anche se non è un singleton (come globale)
Esiste un modo per prevenire copie multiple della classe S? Non riesco a mettere il singleton S in un'altra libreria dinamica.
Executable
/ | \ \
D1 D2 D3 D4
| | |
S S S
EDIT: Il Singleton S è in una libreria statica separata che si collega con la D1 D2 D3 ... a parte.
Il singleton viene allocato nell'heap, solo il puntatore è statico
static s::instance()
{
static smart_ptr<S> ptr = NULL;
if(ptr == NULL) ptr = new S;
return ptr;
}
Edit2:
Ho fatto un semplice caso di test per controllare le cose Questo è un makefile di esempio (sostituire dll. così) ho fatto il check-out, l'ho controllato su Ubuntu e Cygwin, entrambi i compilatori g ++ e il comportamento era diverso. cygwin creato 2 oggetti diversi ma ma ubuntu creata 1 oggetti
all: dynamic1 dynamic2 main
static: static.cpp
g++ -c -fPIC static.cpp -o obj/static.o
ar rvs lib/static.a obj/static.o
dynamic1: static dynamic1.cpp
g++ -fPIC -shared dynamic1.cpp lib/static.a -o lib/libdynamic1.dll
dynamic2: static dynamic2.cpp
g++ -fPIC -shared dynamic2.cpp lib/static.a -o lib/libdynamic2.dll
main: dynamic1 dynamic2 main.cpp
g++ --std=c++11 main.cpp -ldynamic1 -ldynamic2 -o lib/main -L./lib
qual è la vostra intenzione? Se si desidera controllare l'accesso alle risorse condivise, è possibile utilizzare la sincronizzazione dell'interpretazione, ad esempio utilizzando [boost] (http://www.boost.org/doc/libs/1_61_0/doc/html/interprocess/synchronization_mechanisms.html) –
No non si tratta di memoria condivisa tra processi. – tejas
@tejas: perché non puoi creare una DLL su Windows? –