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

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

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

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

02.05.2014, 18:43. Просмотров 431. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Приложение падает при удалении синглтона (C++):

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

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

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

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

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

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

17
Croessmah
Эксперт CЭксперт С++
13423 / 7577 / 855
Регистрация: 27.09.2012
Сообщений: 18,663
Записей в блоге: 3
Завершенные тесты: 1
02.05.2014, 19:16 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
UIManager::GetInstance()->~UIManager();
Рекурсивный вызов деструктора. Вызвали деструктор, в нем delete, который опять вызовет деструктор.
1
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
02.05.2014, 19:19  [ТС] #3
Croessmah, тогда стоит делать так?
C++
1
delete UIManager::GetInstance();
0
stima
485 / 337 / 38
Регистрация: 22.03.2011
Сообщений: 1,079
Завершенные тесты: 2
02.05.2014, 19:21 #4
Да, только не забудьте обнулить статический указатель.
1
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
02.05.2014, 19:21 #5
не нужно вообще никак делать. ч0 ты беспокоишься об этом объекте? он нормально удалится, когда статическая переменная будет уничтожаться!
0
Croessmah
Эксперт CЭксперт С++
13423 / 7577 / 855
Регистрация: 27.09.2012
Сообщений: 18,663
Записей в блоге: 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(){
}
1
stima
485 / 337 / 38
Регистрация: 22.03.2011
Сообщений: 1,079
Завершенные тесты: 2
02.05.2014, 19:23 #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
не нужно вообще никак делать. ч0 ты беспокоишься об этом объекте? он нормально удалится, когда статическая переменная будет уничтожаться!
Кто сказал, что переменная создана на стеке?
0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
02.05.2014, 19:27  [ТС] #8
Цитата Сообщение от stima Посмотреть сообщение
Да, только не забудьте обнулить статический указатель.
Потому что после удаления указатель будет указывать неизвестно куда,а надо, чтобы имел какое-то значение?

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

Добавлено через 4 минуты
Цитата Сообщение от stima Посмотреть сообщение
Кто сказал, что переменная создана на стеке?
а при чём тут вообще стек-то?
0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
02.05.2014, 19:49  [ТС] #11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ну тык в деструкторе ты же написал delete?!
потому приложение и падало, что delete вызывал деструктор, то бишь рекурсия
0
Croessmah
Эксперт CЭксперт С++
13423 / 7577 / 855
Регистрация: 27.09.2012
Сообщений: 18,663
Записей в блоге: 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 ;
}
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
02.05.2014, 19:58 #13
Цитата Сообщение от alexey31415 Посмотреть сообщение
потому приложение и падало, что delete вызывал деструктор, то бишь рекурсия
приложение падало, потому что ты в нём явно вызывал деструктор! нельзя писать вещи вроде
->~SolutionManager(); Это относится практически к любому классу за мегаредчайшими исключениями, не только к твоему синглтону!
А сам по себе деструктор нормален! (при условии, что это действительно синглтон и конструктор приватный)
0
Croessmah
Эксперт CЭксперт С++
13423 / 7577 / 855
Регистрация: 27.09.2012
Сообщений: 18,663
Записей в блоге: 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;
}
правда не везде подойдет
0
stima
485 / 337 / 38
Регистрация: 22.03.2011
Сообщений: 1,079
Завершенные тесты: 2
02.05.2014, 20:05 #15
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
приложение падало, потому что ты в нём явно вызывал деструктор! нельзя писать вещи вроде ->~SolutionManager(); Это относится практически к любому классу за мегаредчайшими исключениям
Неправда. Широко применяться техника размещения обьекта, на заранее выделенной памяти.

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
А сам по себе деструктор нормален! (при условии, что это действительно синглтон и конструктор приватный)
Тоже не правда. Удалять обьект в деструкторе это потеря причинно следственной связи. Как уже было предложено
1. Или дополнительный метод, который удаляет обьект с приватным деструктором. Что является по моему мнению излишне, в данном конкретном случае.
2. Или просто удаляем обьект через взяв его через метод доступа, и в деструкторе обнуляем указатель.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.05.2014, 20:05
Привет! Вот еще темы с ответами:

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

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

Ошибка при удалении массива - C++
Проблема в том, что при попытке добавить строки удаления массивов программа вылетает, если же их нету, то всё стабильно. #include...

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


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
02.05.2014, 20:05
Ответ Создать тему
Опции темы

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