что-то здесь не так: не могу разрулить

Тема в разделе "LANGS.C", создана пользователем varnie, 20 сен 2008.

  1. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    всем привет~

    есть класс, описывающий семантику возврата значения из определённой пользователем функции:
    Код (Text):
    1. class ReturnStatement : public Statement {
    2.     const boost::weak_ptr<Function> _pParentFunction;
    3.     const boost::shared_ptr<Node>  _pNodePtr;
    4. public:
    5.     ReturnStatement(const boost::shared_ptr<Function> &pParentFunction, const boost::shared_ptr<Node> &pNodePtr):
    6.     Statement(), _pParentFunction(pParentFunction), _pNodePtr(pNodePtr) { }
    7.    
    8.     virtual void exec() const {      
    9.         if (_pNodePtr != NULL) {
    10.             _pParentFunction.lock()->setResult(_pNodePtr->getValue());
    11.         }
    12.         globalFlow = FLOW_RETURN;
    13.     }
    14. };
    если представить что pNodePtr сам по себе включает вызов(ы) этой же самой pParentFunction ф-ции (т.е. ф-ция pParentFunction является рекурсивной), то почему-то _pNodePtr никогда не удаляется. если же _pNodePtr объявить как weak_ptr<Node>, то после первого своего же вызова эта ф-ция прекратит своё исполнение, но зато _pNodePtr будет корректно удалён вместе со своими вложенными нодами (смотрел в дебаге в консоль).
    как правильно заимплементировать этот класс? спасибо за поправки
     
  2. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    В порядке трепа, тк буста развернутого щас нет и проверить в дебуге не могу. Но, кажется, _pNodePtr у вас определен статически, те один для всех экземпляров класса.
     
  3. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    _basmp_
    вы не правы. для каждой инстации будет свой. и "захватывать" _pNodePtr будет разные объекты Node.
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Значит есть циклическая зависимость шаред-поинтеров.

    В чем вообще смысл класса?
     
  5. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    _DEN_
    есть юзер-дефайнед ф-ция. мне нужно написать класс описывающий семантику её возвращаемого значения (которое может быть в свою очередь константой, переменной, выражением, или вызовом(ами) этой же/других ф-ций). всё это инкапсулировано в сущность Node. через обычные указатели все работает. т.е. логика класса корректна.
    я не могу разобраться с тем, как перенести всё это на лыжи умных указателей, чтобы добиться автоматического освобождения памяти, занимаемой передаваемым pNodePtr-ом.

    ps: рад видеть кстати!
     
  6. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    те Node нечто вроде умощненного boost::any, позволяющего передавать сложные данные/ресурсы, в том числе и отложенные/асинхронные/рекурсивные вызовы и корректно освождающего/завершающего все это хозяйство при потере всех ссылок на этот Node, без необходимости его явного удаления? Тогда, имхо, вам надо вводить garbage collector (в бусте есть вроде, или внешний) и освобождать в финализере gc.
     
  7. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    _basmp_
    т.е. Node вроде обычного класса. ничего сложного нет. все просто. выше буквально все пояснил.
     
  8. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Из того, что есть мало что понятно :) Почему бы не создать тестовый минимальный пример воспроизводящий ошибку?
     
  9. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    все разобралса. оказалос, что еще в одном классе аналогично я храню не weak_ptr, а shared_ptr. переписал с исползованием weak_ptr, и все стало корректно освобождатса. ура! тема закрыта:)