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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
#1

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

02.05.2014, 18:43. Просмотров 387. Ответов 17
Метки нет (Все метки)

Всем привет. Понадобилось мне использовать паттерн 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12498 / 7060 / 792
Регистрация: 27.09.2012
Сообщений: 17,442
Записей в блоге: 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
432 / 287 / 16
Регистрация: 22.03.2011
Сообщений: 936
Завершенные тесты: 1
02.05.2014, 19:21     Приложение падает при удалении синглтона #4
Да, только не забудьте обнулить статический указатель.
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
02.05.2014, 19:21     Приложение падает при удалении синглтона #5
не нужно вообще никак делать. ч0 ты беспокоишься об этом объекте? он нормально удалится, когда статическая переменная будет уничтожаться!
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12498 / 7060 / 792
Регистрация: 27.09.2012
Сообщений: 17,442
Записей в блоге: 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
432 / 287 / 16
Регистрация: 22.03.2011
Сообщений: 936
Завершенные тесты: 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
432 / 287 / 16
Регистрация: 22.03.2011
Сообщений: 936
Завершенные тесты: 1
02.05.2014, 19:30     Приложение падает при удалении синглтона #9
Цитата Сообщение от alexey31415 Посмотреть сообщение
Потому что после удаления указатель будет указывать неизвестно куда,а надо, чтобы имел какое-то значение?
Да.
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 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
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12498 / 7060 / 792
Регистрация: 27.09.2012
Сообщений: 17,442
Записей в блоге: 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
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
02.05.2014, 19:58     Приложение падает при удалении синглтона #13
Цитата Сообщение от alexey31415 Посмотреть сообщение
потому приложение и падало, что delete вызывал деструктор, то бишь рекурсия
приложение падало, потому что ты в нём явно вызывал деструктор! нельзя писать вещи вроде
->~SolutionManager(); Это относится практически к любому классу за мегаредчайшими исключениями, не только к твоему синглтону!
А сам по себе деструктор нормален! (при условии, что это действительно синглтон и конструктор приватный)
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12498 / 7060 / 792
Регистрация: 27.09.2012
Сообщений: 17,442
Записей в блоге: 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
432 / 287 / 16
Регистрация: 22.03.2011
Сообщений: 936
Завершенные тесты: 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
432 / 287 / 16
Регистрация: 22.03.2011
Сообщений: 936
Завершенные тесты: 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++ Ошибка: "error LNK2001: неразрешенный внешний символ" при реализации шаблонного синглтона
Исправить ошибку из-за которой приложение падает при умножении матриц C++
C++ Ошибка при удалении значения списка

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

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

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