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

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

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

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

02.05.2014, 18:43. Просмотров 400. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2014, 18:43     Приложение падает при удалении синглтона
Посмотрите здесь:

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

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

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

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

std::random_device падает приложение - C++
win7, gcc 4.4.7 пишет, ошибка "std::runtime_error" чего ему надо? Добавлено через 14 часов 17 минут вверх

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

Сортировка методом Синглтона - C++
Здравствуйте, помогите найти информацию по сортировке методом Синглтона. О такой сортировке слышу первый раз, в интернете почти ничего нет,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
02.05.2014, 19:16     Приложение падает при удалении синглтона #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
UIManager::GetInstance()->~UIManager();
Рекурсивный вызов деструктора. Вызвали деструктор, в нем delete, который опять вызовет деструктор.
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
02.05.2014, 19:19  [ТС]     Приложение падает при удалении синглтона #3
Croessmah, тогда стоит делать так?
C++
1
delete UIManager::GetInstance();
stima
449 / 298 / 20
Регистрация: 22.03.2011
Сообщений: 966
Завершенные тесты: 2
02.05.2014, 19:21     Приложение падает при удалении синглтона #4
Да, только не забудьте обнулить статический указатель.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
02.05.2014, 19:21     Приложение падает при удалении синглтона #5
не нужно вообще никак делать. ч0 ты беспокоишься об этом объекте? он нормально удалится, когда статическая переменная будет уничтожаться!
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 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
449 / 298 / 20
Регистрация: 22.03.2011
Сообщений: 966
Завершенные тесты: 2
02.05.2014, 19:23     Приложение падает при удалении синглтона #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
не нужно вообще никак делать. ч0 ты беспокоишься об этом объекте? он нормально удалится, когда статическая переменная будет уничтожаться!
Кто сказал, что переменная создана на стеке?
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
02.05.2014, 19:27  [ТС]     Приложение падает при удалении синглтона #8
Цитата Сообщение от stima Посмотреть сообщение
Да, только не забудьте обнулить статический указатель.
Потому что после удаления указатель будет указывать неизвестно куда,а надо, чтобы имел какое-то значение?

Добавлено через 26 секунд
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
не нужно вообще никак делать. ч0 ты беспокоишься об этом объекте? он нормально удалится, когда статическая переменная будет уничтожаться!
Я динамически выделял память, её нужно освободить.
stima
449 / 298 / 20
Регистрация: 22.03.2011
Сообщений: 966
Завершенные тесты: 2
02.05.2014, 19:30     Приложение падает при удалении синглтона #9
Цитата Сообщение от alexey31415 Посмотреть сообщение
Потому что после удаления указатель будет указывать неизвестно куда,а надо, чтобы имел какое-то значение?
Да.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
02.05.2014, 19:40     Приложение падает при удалении синглтона #10
Цитата Сообщение от alexey31415 Посмотреть сообщение
Я динамически выделял память, её нужно освободить.
ну тык в деструкторе ты же написал delete?! Значит и удалится эта память ровно когда объект умрёт. А вручную-то деструктор вызывать зачем же?

Добавлено через 4 минуты
Цитата Сообщение от stima Посмотреть сообщение
Кто сказал, что переменная создана на стеке?
а при чём тут вообще стек-то?
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
02.05.2014, 19:49  [ТС]     Приложение падает при удалении синглтона #11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ну тык в деструкторе ты же написал delete?!
потому приложение и падало, что delete вызывал деструктор, то бишь рекурсия
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 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
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
02.05.2014, 19:58     Приложение падает при удалении синглтона #13
Цитата Сообщение от alexey31415 Посмотреть сообщение
потому приложение и падало, что delete вызывал деструктор, то бишь рекурсия
приложение падало, потому что ты в нём явно вызывал деструктор! нельзя писать вещи вроде
->~SolutionManager(); Это относится практически к любому классу за мегаредчайшими исключениями, не только к твоему синглтону!
А сам по себе деструктор нормален! (при условии, что это действительно синглтон и конструктор приватный)
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 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
449 / 298 / 20
Регистрация: 22.03.2011
Сообщений: 966
Завершенные тесты: 2
02.05.2014, 20:05     Приложение падает при удалении синглтона #15
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
приложение падало, потому что ты в нём явно вызывал деструктор! нельзя писать вещи вроде ->~SolutionManager(); Это относится практически к любому классу за мегаредчайшими исключениям
Неправда. Широко применяться техника размещения обьекта, на заранее выделенной памяти.

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
А сам по себе деструктор нормален! (при условии, что это действительно синглтон и конструктор приватный)
Тоже не правда. Удалять обьект в деструкторе это потеря причинно следственной связи. Как уже было предложено
1. Или дополнительный метод, который удаляет обьект с приватным деструктором. Что является по моему мнению излишне, в данном конкретном случае.
2. Или просто удаляем обьект через взяв его через метод доступа, и в деструкторе обнуляем указатель.
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
02.05.2014, 20:06  [ТС]     Приложение падает при удалении синглтона #16
Croessmah, синглтон Майерса?
stima
449 / 298 / 20
Регистрация: 22.03.2011
Сообщений: 966
Завершенные тесты: 2
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     Приложение падает при удалении синглтона
Еще ссылки по теме:

Реализация/Аналоги синглтона в dll - C++
Каким образом правильно реализовать синглтон в dll, или каким образом можно сделать что-то подобное синглтону? При сборке dll вылетают...

Не определяется класс Синглтона в другом классе - C++
Подскажите, пожалуйста, что нужно исправить. Компилятор выдает такие ошибки: 1. error c2027: использование неопределенного типа...

Исключение при удалении из списка - C++
class Example { string _name; int _number; public: Example() :Example("Example", 0) {} Example(string str, int num) ...

Утечка памяти при удалении - C++
Здравствуйте! Возникла проблема при удалении последнего элемента из двусвязного списка. Вот код, где я добавляю элемент в конец...

Вылетает при удалении памяти - C++
У меня тут конфуз: class InversTree { struct element { double data; element *parent; ...


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

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

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