Форум программистов, компьютерный форум CyberForum.ru

Приложение падает при удалении синглтона - C++

Восстановить пароль Регистрация
 
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
02.05.2014, 18:43     Приложение падает при удалении синглтона #1
Всем привет. Понадобилось мне использовать паттерн Singleton, реализовал я его так.
тыц
C++
1
2
3
4
5
6
7
UIManager* UIManager::GetInstance(){
    if(!m_Instance){
        m_Instance = new UIManager();
    }
 
    return m_Instance;
}


Также добавил в деструкторе удаление указателя
C++
1
2
3
UIManager::~UIManager(){
    delete m_Instance;
}
В деструкторе класса окна вызываю деструкторы классов, дабы освобождалась память
C++
1
2
3
4
5
MainWindow::~MainWindow()
{
    UIManager::GetInstance()->~UIManager();
    SolutionManager::GetInstance()->~SolutionManager();
}
Но при закрытии окна, приложение ругается на Segmentation fault.
И указывается строка с delete в деструкторе UIManager.
Я понимаю, что проблема здесь, но не понимаю почему. Знает ли кто-то в чём дело?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2014, 18:43     Приложение падает при удалении синглтона
Посмотрите здесь:

Вылетает при удалении памяти C++
C++ Сортировка методом Синглтона
C++ Приложение падает на другом компе
C++ std::random_device падает приложение
C++ Падает то не падает) APPCRASH StackHash PCH FROM ntdll
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11848 / 6827 / 772
Регистрация: 27.09.2012
Сообщений: 16,930
Записей в блоге: 2
Завершенные тесты: 1
02.05.2014, 19:16     Приложение падает при удалении синглтона #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
UIManager::GetInstance()->~UIManager();
Рекурсивный вызов деструктора. Вызвали деструктор, в нем delete, который опять вызовет деструктор.
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
02.05.2014, 19:19  [ТС]     Приложение падает при удалении синглтона #3
Croessmah, тогда стоит делать так?
C++
1
delete UIManager::GetInstance();
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
02.05.2014, 19:21     Приложение падает при удалении синглтона #4
Да, только не забудьте обнулить статический указатель.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
02.05.2014, 19:21     Приложение падает при удалении синглтона #5
не нужно вообще никак делать. ч0 ты беспокоишься об этом объекте? он нормально удалится, когда статическая переменная будет уничтожаться!
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11848 / 6827 / 772
Регистрация: 27.09.2012
Сообщений: 16,930
Записей в блоге: 2
Завершенные тесты: 1
02.05.2014, 19:21     Приложение падает при удалении синглтона #6
Цитата Сообщение от alexey31415 Посмотреть сообщение
тогда стоит делать так?
можно так:
C++
1
2
3
4
5
6
   static void Release () {
      delete m_Instance ;
      m_Instance = NULL ;
   }
UIManager::~UIManager(){
}
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
02.05.2014, 19:23     Приложение падает при удалении синглтона #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
не нужно вообще никак делать. ч0 ты беспокоишься об этом объекте? он нормально удалится, когда статическая переменная будет уничтожаться!
Кто сказал, что переменная создана на стеке?
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
02.05.2014, 19:27  [ТС]     Приложение падает при удалении синглтона #8
Цитата Сообщение от stima Посмотреть сообщение
Да, только не забудьте обнулить статический указатель.
Потому что после удаления указатель будет указывать неизвестно куда,а надо, чтобы имел какое-то значение?

Добавлено через 26 секунд
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
не нужно вообще никак делать. ч0 ты беспокоишься об этом объекте? он нормально удалится, когда статическая переменная будет уничтожаться!
Я динамически выделял память, её нужно освободить.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
02.05.2014, 19:30     Приложение падает при удалении синглтона #9
Цитата Сообщение от alexey31415 Посмотреть сообщение
Потому что после удаления указатель будет указывать неизвестно куда,а надо, чтобы имел какое-то значение?
Да.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
02.05.2014, 19:40     Приложение падает при удалении синглтона #10
Цитата Сообщение от alexey31415 Посмотреть сообщение
Я динамически выделял память, её нужно освободить.
ну тык в деструкторе ты же написал delete?! Значит и удалится эта память ровно когда объект умрёт. А вручную-то деструктор вызывать зачем же?

Добавлено через 4 минуты
Цитата Сообщение от stima Посмотреть сообщение
Кто сказал, что переменная создана на стеке?
а при чём тут вообще стек-то?
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
02.05.2014, 19:49  [ТС]     Приложение падает при удалении синглтона #11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ну тык в деструкторе ты же написал delete?!
потому приложение и падало, что delete вызывал деструктор, то бишь рекурсия
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11848 / 6827 / 772
Регистрация: 27.09.2012
Сообщений: 16,930
Записей в блоге: 2
Завершенные тесты: 1
02.05.2014, 19:52     Приложение падает при удалении синглтона #12
Ну можно так изгаляться:
C++
1
2
3
4
5
UIManager::~UIManager(){
   UIManager * temp = m_Instance ;
   m_Instance = 0 ;
   delete temp ;
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
02.05.2014, 19:58     Приложение падает при удалении синглтона #13
Цитата Сообщение от alexey31415 Посмотреть сообщение
потому приложение и падало, что delete вызывал деструктор, то бишь рекурсия
приложение падало, потому что ты в нём явно вызывал деструктор! нельзя писать вещи вроде
->~SolutionManager(); Это относится практически к любому классу за мегаредчайшими исключениями, не только к твоему синглтону!
А сам по себе деструктор нормален! (при условии, что это действительно синглтон и конструктор приватный)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11848 / 6827 / 772
Регистрация: 27.09.2012
Сообщений: 16,930
Записей в блоге: 2
Завершенные тесты: 1
02.05.2014, 20:04     Приложение падает при удалении синглтона #14
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
А сам по себе деструктор нормален!
Не нормален он. Он вызывает delete для того же статического объекта.

Чтобы не возиться с памятью:
C++
1
2
3
4
5
6
7
8
9
10
11
class UIManager
{
public:
   static UIManager * GetInstance() ;
//...
} ;
 
UIManager* UIManager::GetInstance(){
    static UIManager m_Instance ;
    return &m_Instance;
}
правда не везде подойдет
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
02.05.2014, 20:05     Приложение падает при удалении синглтона #15
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
приложение падало, потому что ты в нём явно вызывал деструктор! нельзя писать вещи вроде ->~SolutionManager(); Это относится практически к любому классу за мегаредчайшими исключениям
Неправда. Широко применяться техника размещения обьекта, на заранее выделенной памяти.

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
А сам по себе деструктор нормален! (при условии, что это действительно синглтон и конструктор приватный)
Тоже не правда. Удалять обьект в деструкторе это потеря причинно следственной связи. Как уже было предложено
1. Или дополнительный метод, который удаляет обьект с приватным деструктором. Что является по моему мнению излишне, в данном конкретном случае.
2. Или просто удаляем обьект через взяв его через метод доступа, и в деструкторе обнуляем указатель.
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
02.05.2014, 20:06  [ТС]     Приложение падает при удалении синглтона #16
Croessmah, синглтон Майерса?
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
02.05.2014, 20:09     Приложение падает при удалении синглтона #17
2Croessmah. только Вы забыли упомянуть, что в случае если если сингелтон был реализован через статик обьект, то об этом должен знать тот кто пользуется данным классом, чтобы не вызывать явный delete.

Добавлено через 1 минуту
Цитата Сообщение от alexey31415 Посмотреть сообщение
Croessmah, синглтон Майерса?
Да иногда его так называют. У него есть свои минусы - его нельзя удалить.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.05.2014, 20:09     Приложение падает при удалении синглтона
Еще ссылки по теме:

Ошибка при удалении массива C++
C++ Утечка памяти при удалении
C++ Реализация/Аналоги синглтона в dll

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11848 / 6827 / 772
Регистрация: 27.09.2012
Сообщений: 16,930
Записей в блоге: 2
Завершенные тесты: 1
02.05.2014, 20:09     Приложение падает при удалении синглтона #18
Цитата Сообщение от alexey31415 Посмотреть сообщение
Croessmah, синглтон Майерса?
угу. Только у него ссылка возвращается.
Yandex
Объявления
02.05.2014, 20:09     Приложение падает при удалении синглтона
Ответ Создать тему
Опции темы

Текущее время: 16:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru