Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Падает программа (сигналы и слоты)
Форум на CrossPlatform.RU > Библиотеки > boost
medhaid
Здравствуйте,
В этот раз сам разобраться не смог....

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

#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
chkstk.asm - проблемы со стеком. он тупо переполняется.
увеличивай стек. но это нехорошая тенденция - увеличивать стек, если количество переменных и глубина цепочки вызовов может меняться. лучше подумать об оптимизации.
Алексей1153
можно организовать в классЕ статический массив-дерево. Тогда обход дерева можно будет в цикле делать, а не загружать стек рекурсией
medhaid
ага, переполнение стека) ток вчера въехал почему.....
я думал что сигнал запомниться в очередь а потом по выходу из деструктора выполниться... как бы не какой рекурсии...

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

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



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

это всегда надо иметь в виду. когда программист не думает о том, какие ресурсы сожрёт его софтина, потом получаются всякие нехорошие вещи :) из решения мелких задач складывается опыт программирования. чем больше опыта - тем быстрее и лучше программист справляется с задачами.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.