Предположим, что у меня есть класс синглтон S в статической библиотеке, это может быть связано с другими динамическими библиотеками D1 D2 D3,Singleton класс в статической библиотеке
Так от того, что я понимаю, класс S будет иметь отдельный экземпляр в каждом D1, D2 и D3, и это было бы правдой, даже если оно не является одиночным (как глобальное)
Есть ли способ предотвратить множественные копии класса S? Я не могу поместить синглтон S в другую динамическую библиотеку.
Executable
/ | \ \
D1 D2 D3 D4
| | |
S S S
EDIT: Одноэлементный S находится в отдельной статической библиотеки, которая связывает с D1 D2 D3 ... отдельно.
Одноэлементный выделяется в куче, только указатель статична
static s::instance()
{
static smart_ptr<S> ptr = NULL;
if(ptr == NULL) ptr = new S;
return ptr;
}
Edit2:
Я сделал простой тест, чтобы проверить вещи Это образец Makefile (замените .dll на. так что я сделал, чтобы проверить все, я проверил его на Ubuntu и Cygwin, как компиляторы g ++, так и поведение было другим. cygwin создал 2 разных объекта, но ubuntu создал 1 объект
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
Каково ваше намерение? Если вы хотите контролировать доступ к общим ресурсам, вы можете использовать межпроцессную синхронизацию, например, используя [boost] (http://www.boost.org/doc/libs/1_61_0/doc/html/interprocess/synchronization_mechanisms.html) –
Нет это не об общей памяти между процессами. – tejas
@tejas: почему вы не можете сделать S DLL на Windows? –