Могу ли я создать второй экземпляр синглтона в DLL?

У меня есть статическая библиотека, содержащая синглтоны. Мне нужно загрузить отдельный экземпляр этих синглетонов в том же процессе для целей тестирования.

Поэтому я создал DLL, которая связывает ту же статическую библиотеку, а затем основной процесс загружает эту DLL.

Как только DLL пытается загрузиться, я получаю нарушения доступа при попытке доступа к указателям статических экземпляров в синглтонах.

В некоторых сообщениях, которые я прочитал, говорится, что это невозможно и что мне нужен второй процесс, в то время как другие говорят, что каждая DLL получает свои собственные копии всех статических переменных в статической библиотеке, на которую она ссылается, что предполагает, что это должно работать.

Возможно ли то, что я пытаюсь сделать?


person CuriousGeorge    schedule 19.09.2012    source источник
comment
Можете ли вы показать соответствующий код, который дает нарушения прав доступа? Как скоро вы имеете в виду, когда говорите, как только DLL пытается загрузиться?   -  person paddy    schedule 19.09.2012
comment
Марк был прав, см. комментарии под его постом.   -  person CuriousGeorge    schedule 19.09.2012


Ответы (1)


В большинстве случаев синглтон на самом деле должен быть только один - ваш запрос необычен.

Я знаю, что связывание статической библиотеки с DLL может привести к множеству экземпляров статических переменных, потому что я видел это сам. Каждая DLL или EXE получает свою собственную копию статической библиотеки через компоновщик и, следовательно, свою собственную копию статических переменных.

Нарушения прав доступа могут возникать из-за проблем с порядком инициализации. Лучший способ контролировать это — убедиться, что статические переменные находятся внутри функции, которая инициализирует их вовремя, а не в глобальных переменных.

person Mark Ransom    schedule 19.09.2012
comment
Или библиотеки выделяют/используют именованные системные ресурсы (такие как мьютексы, события и т. д.) и совершенно справедливо топчут друг друга в процессе. Это чрезвычайно распространено, когда «вовлеченные» статические библиотеки обнаруживают дублирование в адресном пространстве одного процесса. - person WhozCraig; 19.09.2012
comment
@Mark: Вы были правы насчет проблемы с порядком инициализации. Вместо этого я перешел на DLL, чтобы создать экземпляр синглтона по запросу, и больше не получаю нарушений прав доступа, но теперь оба указателя экземпляра в конечном итоге указывают на один и тот же объект. Я не понимаю, почему они не получают каждый свой собственный экземпляр. - person CuriousGeorge; 19.09.2012
comment
На самом деле, я понял. После извлечения синглтона из DLL вызов GetInstance() для этого синглтона внутри одной из единиц трансляции основного процесса дает указатель экземпляра синглтона из основного процесса. Но когда я экспортирую функцию из DLL, которая вызывает GetInstance() внутри одной из единиц трансляции DLL, я получаю уникальный указатель. Спасибо за помощь =) - person CuriousGeorge; 19.09.2012