crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Падает программа (сигналы и слоты), непонятное исключение
medhaid
  опции профиля:
сообщение 17.1.2012, 22:33
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 13.1.2012
Пользователь №: 3130

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте,
В этот раз сам разобраться не смог....

написал небольшой пример использования сигналов и слотов....
в нём создаются элементы, и каждый последующий следит за преведущим, если последний созданный элемент удалить, то по цепочке удаляться все остальные

#include <boost/signal.hpp>
#include <boost/bind.hpp>
#include <iostream>

int count = 0;

//===============================класс в котором возникает событие==========
class ObJEcT//: public boost::signals::trackable
{
public:
    ObJEcT()
    {
        count++;
    }

    ObJEcT(ObJEcT *obj)
    {
        count++;
        this->connectOnDestroy(boost::bind(&ObJEcT::destroy, obj));
    }

    ~ObJEcT()
    {
        count--;
        std::cout << "~ " << count<< std::endl;
        onDestroy(); //при удаление сообшяем всем кто слушает
    }

    void destroy()
    {
        delete this;
    }

    //возрашяет ссылку на сигнал.. для отмены если чё..
    void connectOnDestroy(boost::function<void()> slot)
    {
        onDestroy.connect(slot);
    }

private:
    boost::signal<void (void)> onDestroy;
};


int main()
{
    
    ObJEcT *tmp = new ObJEcT();
    for (int i = 0; i < 232; i++) // 232 отрабатывает нормально если выше то програма вылетает
    {
        tmp = new ObJEcT(tmp);
    }
    delete tmp;

    system("pause");

    return 0;
}


при количестве объектов меньше 233 всё работает нормально, если свыше то программа вылетает ссылаясь на какой-то асемблеровский файл chkstk.asm

с чем это связано???)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 17.1.2012, 23:37
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1593
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 218 раз(а)




Репутация:   12  


chkstk.asm - проблемы со стеком. он тупо переполняется.
увеличивай стек. но это нехорошая тенденция - увеличивать стек, если количество переменных и глубина цепочки вызовов может меняться. лучше подумать об оптимизации.

Сообщение отредактировал Iron Bug - 17.1.2012, 23:41
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.1.2012, 7:36
Сообщение #3


фрилансер
******

Группа: Участник
Сообщений: 2890
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


можно организовать в классЕ статический массив-дерево. Тогда обход дерева можно будет в цикле делать, а не загружать стек рекурсией

Сообщение отредактировал Алексей1153 - 19.1.2012, 6:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
medhaid
  опции профиля:
сообщение 18.1.2012, 20:42
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 13.1.2012
Пользователь №: 3130

Спасибо сказали: 0 раз(а)




Репутация:   0  


ага, переполнение стека) ток вчера въехал почему.....
я думал что сигнал запомниться в очередь а потом по выходу из деструктора выполниться... как бы не какой рекурсии...

как вычитал в boost signal вызов прямой сразу...
а вот в signal2 вызов через очереди.. и с ними мой пример(в теории, пока не проверил) отработал бы нормально..

Спасибо, за подсказку.



P.S. насчёт оптимизации, я просто разбираюсь... как бы такой задачи нет...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 18.1.2012, 22:52
Сообщение #5


Профессионал
*****

Группа: Модератор
Сообщений: 1593
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 218 раз(а)




Репутация:   12  


Цитата(medhaid @ 18.1.2012, 23:42) *
P.S. насчёт оптимизации, я просто разбираюсь... как бы такой задачи нет...

это всегда надо иметь в виду. когда программист не думает о том, какие ресурсы сожрёт его софтина, потом получаются всякие нехорошие вещи :) из решения мелких задач складывается опыт программирования. чем больше опыта - тем быстрее и лучше программист справляется с задачами.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 15.12.2019, 6:02