Załóżmy, że mam klasy Singleton S w statycznej biblioteki, może to być związane z innymi dynamicznych bibliotek D1 D2 D3class Singleton w statycznej biblioteki
Więc z tego co rozumiem klasa S będzie mieć oddzielny wystąpienie w każdym D1, D2 i D3 i byłoby to prawdą, nawet jeśli nie jest to singleton (podobnie jak globalny). Czy istnieje sposób na uniknięcie wielu kopii klasy S? Nie mogę umieścić singletonu S w innej bibliotece dynamicznej.
Executable
/ | \ \
D1 D2 D3 D4
| | |
S S S
EDIT: Singletor S jest w osobnej biblioteki statycznej, która łączy ze D1 D2 D3 ... oddzielnie.
Singletor jest przydzielona w stercie, tylko wskaźnik jest statyczna
static s::instance()
{
static smart_ptr<S> ptr = NULL;
if(ptr == NULL) ptr = new S;
return ptr;
}
Edit2:
Zrobiłem prosty przypadek testowy, aby sprawdzić rzeczy To makefile próbki (zastąpienie przez .dll. więc) zrobiłem, żeby sprawdzić rzeczy, sprawdziłem to na Ubuntu i Cygwin, oba kompilatory g ++, a zachowanie było inne. Cygwin stworzony 2 różne przedmioty, ale jednak ubuntu Utworzony 1 obiektów
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
jaki jest twój zamiar? Jeśli chcesz kontrolować dostęp do współużytkowanych zasobów, możesz użyć synchronizacji międzyprocesowej, na przykład używając [boost] (http://www.boost.org/doc/libs/1_61_0/doc/html/interprocess/synchronization_mechanisms.html) –
Nie nie chodzi o pamięć współdzieloną między procesami. – tejas
@tejas: dlaczego nie można utworzyć biblioteki DLL w systemie Windows? –