Я никогда не пробовал это сам, документация , кажется, указывает, что статические переменные должны быть "повторно инициализированы" после перезагрузки.Для меня совершенно не очевидно, как это взаимодействует с пре-main()
хуками C ++.Вы можете попытаться понять это (проверьте документацию вашего поставщика или просто откройте бинарный файл и посмотрите), но, вероятно, его проще перепроектировать.Некоторые идеи:
Если можете, избавьтесь от своих одиноких.Как уже упоминалось в комментариях, в наши дни консенсус в отрасли заключается в том, что в большинстве случаев синглтон-паттерн - это больше проблем, чем стоит - как вы обнаруживаете!Честно говоря, у вас не было бы этой проблемы в Java или Ruby, но все же.
Если вы компилируете с помощью gcc, вы можете зарегистрировать некоторые хуки для "до dlopen()
возврата" и "после dlclose()
называется ".Снова из документов:
...libraries should export routines using the __attribute__((constructor)) and __attribute__((destructor)) function attributes. See the gcc info pages for information on these. Constructor routines are executed before dlopen() returns, and destructor routines are executed before dlclose() returns."
Я почти уверен, что это зависит от gcc;если вы не используете gcc, ваша платформа может предложить нечто подобное.
Если вы не можете этого сделать, попробуйте переключиться на стиль «инициализация при первом использовании» одноэлементной реализации.Идея состоит в том, чтобы обнаружить в Instance()
, был ли ваш MySettings
синглтон уже создан, и сначала создать его, если это не так.Что-то вроде:
static MySettings* theSingleton = NULL;
if(theSingleton == NULL)
theSingleton = new MySettings();
return *theSingleton;
Обратите внимание, что эта версия Instance()
является не поточно-ориентированной;если вы хотите, вам придется пойти на некоторые неприятности.Также: theSingleton
никогда не будет удалено, поэтому ваша проблема будет приводить к утечке памяти / файловых дескрипторов / чего угодно при каждой перезагрузке вашего плагина.В зависимости от того, что вы храните в MySettings
и как часто вы ожидаете, что пользователи перезагрузят ваш плагин между перезапусками процесса, это может или не может быть приемлемым.
Надеюсь, это поможет.