Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2012, 21:36   #1
MrGukk
Пользователь
 
Регистрация: 09.05.2011
Сообщений: 33
По умолчанию Почему вызывается деструктор?

Здравствуйте,

Попытка создать синглтон привела к следующему коду:
Код:
class Single
{
public:
    static Single* CreateSingle();
    ~Single() {std::cout << "\nDestructor addr = " << addr; delete addr;};
    void show();
private:
    static Single* addr;
    Single();
    static bool flag;
    int a;
};

void Single::show()
{
    std::cout<<"\na = "<<a<<endl;
}

bool Single::flag = true;
Single* Single::addr = NULL;

Single* Single::CreateSingle()
{
    if(flag)
    {
        Single();
        addr = new Single;
        std::cout<<"\nConstructor addr = " << addr;
        return addr;
    }
    else
        return NULL;
}

Single::Single()
{
    flag = false;
    a = 66;
}

int _tmain(int argc, _TCHAR* argv[])
{
    Single* s = Single::CreateSingle();
    Single* ss = Single::CreateSingle();
    s->show();
    return 0;
}
Всё работает нормально, вот только после вызова конструктора в функции CreateSingle, вызывается деструктор.
Вывод программы:
Destructor addr = 00000000
Constructor addr = 0036F438
a = 66

Для какого объекта вызывается деструктор?

Заранее спасибо.
MrGukk вне форума Ответить с цитированием
Старый 17.08.2012, 21:38   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Код:
if(flag)
    {
        Single();
        addr = new Single;
        std::cout<<"\nConstructor addr = " << addr;
        return addr;
    }
counter вне форума Ответить с цитированием
Старый 17.08.2012, 21:43   #3
MrGukk
Пользователь
 
Регистрация: 09.05.2011
Сообщений: 33
По умолчанию

Извиняюсь за рудемент - Single() убрал из CreateSingle().
Теперь всё работает правильно.
Причина ошибки ясна, но не ясно что-же тогда конструирует Single()?
MrGukk вне форума Ответить с цитированием
Старый 17.08.2012, 21:45   #4
MrGukk
Пользователь
 
Регистрация: 09.05.2011
Сообщений: 33
По умолчанию

И раз уж зашла речь о синглтонах. Покритикуйте плиз такой вариант реализации. Буду благодарен.
MrGukk вне форума Ответить с цитированием
Старый 17.08.2012, 22:23   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от MrGukk Посмотреть сообщение
не ясно что-же тогда конструирует Single()?
new Single;
waleri вне форума Ответить с цитированием
Старый 17.08.2012, 22:25   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от MrGukk Посмотреть сообщение
Покритикуйте плиз такой вариант реализации. Буду благодарен.
flag излишен. Вполне можно использовать addr для той же цели.
waleri вне форума Ответить с цитированием
Старый 17.08.2012, 22:55   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2MrGukk
плохо. flag не нужен, CreateSingle с какого-то перепуга возвращает NULL, потоконебезопасно.

Код:
class Singleton() {
public:
    static Singleton &instance();

private:
    Singleton() {};
    Singleton(const Singleton &);
    Singleton &operator=(const Singleton &);
};

Singleton &Singleton::instance()
{
    static Singleton inst;
    return inst;
}

...

Singleton &s = Singleton::instance();
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 20.08.2012, 15:50   #8
MrGukk
Пользователь
 
Регистрация: 09.05.2011
Сообщений: 33
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
new Single;
Т.е. вы хотите сказать что при вызове конструктора явно в методе класса Single() эквивалентен new Single?
Конструктор ведь ничего не возвращает, т.е. после выделения памяти указатель на выделенное место в куче теряется и память должна утекать.
Тем не менее деструктор вызывается, но для какого "адреса"?
Посмотрел гугл - не нашёл. Не могли бы вы дать ссылку на разъяснение?
MrGukk вне форума Ответить с цитированием
Старый 20.08.2012, 15:51   #9
MrGukk
Пользователь
 
Регистрация: 09.05.2011
Сообщений: 33
По умолчанию

Спасибо за критику)
MrGukk вне форума Ответить с цитированием
Старый 20.08.2012, 15:59   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от MrGukk Посмотреть сообщение
Т.е. вы хотите сказать что при вызове конструктора явно в методе класса Single() эквивалентен new Single?
Конструктор ведь ничего не возвращает, т.е. после выделения памяти указатель на выделенное место в куче теряется и память должна утекать.
Я хочу сказать, что когда мы создаем объект через new вызывается его конструктор. Ваш вопрос был "что конструирует Single", я и ответил. Да, конструктор ничего не возрващает, но вы то НЕ вызываете конструкор а оператор new, а вот он возвращает.

В С++ нельзя вызывать конструкторы и деструкторы напрямую, явно (деструкторы можно, но ето скорее изключение и надо знать, что и зачем делается.).

В вашем случае деструктор вообще не вызывается (или по крайней мере я не вижу где удаляется addr).
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не вызывается функция JS Dexes PHP 1 01.02.2012 10:57
Процедура не вызывается Точьичка Общие вопросы Delphi 6 25.09.2011 17:52
EnumThreadWndProc не вызывается bro Win Api 4 16.04.2011 23:00
не вызывается Paint в borland 5 primeplus Общие вопросы C/C++ 4 08.08.2009 08:14
Не вызывается процедура. Что не так? KingMaker Общие вопросы Delphi 4 12.04.2009 00:59