Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
alexey31415
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
1

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

02.05.2014, 18:43. Просмотров 993. Ответов 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.
Я понимаю, что проблема здесь, но не понимаю почему. Знает ли кто-то в чём дело?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2014, 18:43
Ответы с готовыми решениями:

Падает приложение при вводе данных в массив
Итак, есть код который компилируется и даже запускается. Но бреблема в том, что...

При чтении по адресу приложение падает с кодом 0x0
При попытке считать разрешение экрана по адресу который я ввожу, консоль просто...

Исправить ошибку из-за которой приложение падает при умножении матриц
Привет прогеры! Объясните обезьяне почему у меня кидает exeption программа при...

Ошибка: "error LNK2001: неразрешенный внешний символ" при реализации шаблонного синглтона
Доброго времени суток. Пытаюсь написать шаблон для синглтона, есть след. код...

Приложение падает на другом компе
ОС Ubuntu-64 linux. Написал, отладил и скомпилировал приложение на домашнем...

17
Croessmah
++Ͻ
14938 / 8531 / 1627
Регистрация: 27.09.2012
Сообщений: 21,012
Записей в блоге: 2
Завершенные тесты: 1
02.05.2014, 19:16 2
Лучший ответ Сообщение было отмечено alexey31415 как решение

Решение

C++
1
UIManager::GetInstance()->~UIManager();
Рекурсивный вызов деструктора. Вызвали деструктор, в нем delete, который опять вызовет деструктор.
1
alexey31415
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
02.05.2014, 19:19  [ТС] 3
Croessmah, тогда стоит делать так?
C++
1
delete UIManager::GetInstance();
0
stima
495 / 345 / 93
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
02.05.2014, 19:21 4
Да, только не забудьте обнулить статический указатель.
1
Kuzia domovenok
2430 / 2157 / 528
Регистрация: 25.03.2012
Сообщений: 7,775
Записей в блоге: 1
02.05.2014, 19:21 5
не нужно вообще никак делать. ч0 ты беспокоишься об этом объекте? он нормально удалится, когда статическая переменная будет уничтожаться!
0
Croessmah
++Ͻ
14938 / 8531 / 1627
Регистрация: 27.09.2012
Сообщений: 21,012
Записей в блоге: 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(){
}
1
stima
495 / 345 / 93
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
02.05.2014, 19:23 7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
не нужно вообще никак делать. ч0 ты беспокоишься об этом объекте? он нормально удалится, когда статическая переменная будет уничтожаться!
Кто сказал, что переменная создана на стеке?
0
alexey31415
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
02.05.2014, 19:27  [ТС] 8
Цитата Сообщение от stima Посмотреть сообщение
Да, только не забудьте обнулить статический указатель.
Потому что после удаления указатель будет указывать неизвестно куда,а надо, чтобы имел какое-то значение?

Добавлено через 26 секунд
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
не нужно вообще никак делать. ч0 ты беспокоишься об этом объекте? он нормально удалится, когда статическая переменная будет уничтожаться!
Я динамически выделял память, её нужно освободить.
0
stima
495 / 345 / 93
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
02.05.2014, 19:30 9
Цитата Сообщение от alexey31415 Посмотреть сообщение
Потому что после удаления указатель будет указывать неизвестно куда,а надо, чтобы имел какое-то значение?
Да.
1
Kuzia domovenok
2430 / 2157 / 528
Регистрация: 25.03.2012
Сообщений: 7,775
Записей в блоге: 1
02.05.2014, 19:40 10
Цитата Сообщение от alexey31415 Посмотреть сообщение
Я динамически выделял память, её нужно освободить.
ну тык в деструкторе ты же написал delete?! Значит и удалится эта память ровно когда объект умрёт. А вручную-то деструктор вызывать зачем же?

Добавлено через 4 минуты
Цитата Сообщение от stima Посмотреть сообщение
Кто сказал, что переменная создана на стеке?
а при чём тут вообще стек-то?
0
alexey31415
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
02.05.2014, 19:49  [ТС] 11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ну тык в деструкторе ты же написал delete?!
потому приложение и падало, что delete вызывал деструктор, то бишь рекурсия
0
Croessmah
++Ͻ
14938 / 8531 / 1627
Регистрация: 27.09.2012
Сообщений: 21,012
Записей в блоге: 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 ;
}
0
Kuzia domovenok
2430 / 2157 / 528
Регистрация: 25.03.2012
Сообщений: 7,775
Записей в блоге: 1
02.05.2014, 19:58 13
Цитата Сообщение от alexey31415 Посмотреть сообщение
потому приложение и падало, что delete вызывал деструктор, то бишь рекурсия
приложение падало, потому что ты в нём явно вызывал деструктор! нельзя писать вещи вроде
->~SolutionManager(); Это относится практически к любому классу за мегаредчайшими исключениями, не только к твоему синглтону!
А сам по себе деструктор нормален! (при условии, что это действительно синглтон и конструктор приватный)
0
Croessmah
++Ͻ
14938 / 8531 / 1627
Регистрация: 27.09.2012
Сообщений: 21,012
Записей в блоге: 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;
}
правда не везде подойдет
0
stima
495 / 345 / 93
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
02.05.2014, 20:05 15
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
приложение падало, потому что ты в нём явно вызывал деструктор! нельзя писать вещи вроде ->~SolutionManager(); Это относится практически к любому классу за мегаредчайшими исключениям
Неправда. Широко применяться техника размещения обьекта, на заранее выделенной памяти.

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

Добавлено через 1 минуту
Цитата Сообщение от alexey31415 Посмотреть сообщение
Croessmah, синглтон Майерса?
Да иногда его так называют. У него есть свои минусы - его нельзя удалить.
0
Croessmah
++Ͻ
14938 / 8531 / 1627
Регистрация: 27.09.2012
Сообщений: 21,012
Записей в блоге: 2
Завершенные тесты: 1
02.05.2014, 20:09 18
Цитата Сообщение от alexey31415 Посмотреть сообщение
Croessmah, синглтон Майерса?
угу. Только у него ссылка возвращается.
0
02.05.2014, 20:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.05.2014, 20:09

std::random_device падает приложение
win7, gcc 4.4.7 пишет, ошибка "std::runtime_error" чего ему надо? ...

Сортировка методом Синглтона
Здравствуйте, помогите найти информацию по сортировке методом Синглтона. О...

Реализация/Аналоги синглтона в dll
Каким образом правильно реализовать синглтон в dll, или каким образом можно...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru