извиняйте, гугл чет не помог в этот раз... пытаюсь собрать простой синглтон с флагом -nostdlib: single.h: Код (Text): #ifndef _SINGLE_H_INCLUDED_ #define _SINGLE_H_INCLUDED_ #include <windows.h> class Single { public: static Single* GetInstance(); static void Release(); private: Single(); ~Single(); }; #endif single.cpp Код (Text): #include <single.h> Single::Single() { MessageBoxA(NULL, "CONSTRUCTOR", "WORKS!", MB_OK); } Single::~Single() { MessageBoxA(NULL, "DESTRUCTOR", "WORKS!", MB_OK); } Single* Single::GetInstance() { // Вызов конструктора по умолчанию static Single Instance; return &Instance; } void Single::Release() { // Вызов деструктора по умолчанию Single::GetInstance()->~Single(); } main.cpp Код (Text): #include <single.h> int _main() { Single* single = Single::GetInstance(); single->Release(); return 0; } получаю кучу ошибок линкера на функции, которые MinGW добавляет в мой бинарь... среди них atexit, __gxx_personality_sj0, _Unwind_SjLj_Register и другие... вопрос: возможно ли реализовать подобный синглтон без зависимости на стандартные либы, и если да то как это сделать...
я думаю, что как и в ms c++ некоторые ооп фичи завязаны на rtl. в частности, вызов деструктора объекта в статической памяти осуществляется с помощью функции atexit
Да в студии спокойно реализовывается. Только спецефические типа исключений. По-разному бывает, но в целом, и это тоже. Но оно так только в случае хитрых инициализаторов, например, Код (Text): #include <windows.h> int initialize() { return 5+GetLastError(); } int some_var = initialize(); int main() { return some_var; } Всего о нескольких вещах нужно позаботиться при отказе от crt (речь не про сишную crt, а про crp - c++ runtime): об исключениях, о инициализаторах/терминаторах (то, о чем ты говоришь), некоторые штуки из namespace std (в первую очередь, для stringbuf), ... да вроде всё.
да, atexit по идее должен вызвать деструктор синглтона по завершении работы приложения, но я хочу делать это самостоятельно, вызывая функцию Release... остальные пока не особо понятно зачем там... это понятно... мне важно отучить компилятор всовывать в код ненужные мне функции, и если они всетки нужные - реализовать их самому... сегодня поищу в мингв эти функции и еще попробую студией собрать... ADD: в студии для статически выделенного синглтона не хватает _atexit и оператора delete)) есть ли возможность отучить компилятор пытаться удалять мой синглтон?))
может так лучше instance сделать статическим членом класса, а его созданием/удалением управлять вручную?
можно, но тогда понадобится _initterm для инициализации указателя на instance внутри класса в NULL... уходим от одного - приходим к другому... но дело даже не в этом, я могу и заглушки сделать на эти функции, поскольку они скорее всего бессмысленны... вот допустим с atexit ситуация, компилятор пытыается этой функцией зарегистрировать деструктор в массиве atexit-функций, но... дело в том, что CRT-точка входа не используется, и получается что этот массив никто не станет вызывать... так зачем atexit?
вероятно, регистрация через atexit вставляется непосредственно компилятором, которому вообще нет дела до точки входа.