всем привет~ есть класс, описывающий семантику возврата значения из определённой пользователем функции: Код (Text): class ReturnStatement : public Statement { const boost::weak_ptr<Function> _pParentFunction; const boost::shared_ptr<Node> _pNodePtr; public: ReturnStatement(const boost::shared_ptr<Function> &pParentFunction, const boost::shared_ptr<Node> &pNodePtr): Statement(), _pParentFunction(pParentFunction), _pNodePtr(pNodePtr) { } virtual void exec() const { if (_pNodePtr != NULL) { _pParentFunction.lock()->setResult(_pNodePtr->getValue()); } globalFlow = FLOW_RETURN; } }; если представить что pNodePtr сам по себе включает вызов(ы) этой же самой pParentFunction ф-ции (т.е. ф-ция pParentFunction является рекурсивной), то почему-то _pNodePtr никогда не удаляется. если же _pNodePtr объявить как weak_ptr<Node>, то после первого своего же вызова эта ф-ция прекратит своё исполнение, но зато _pNodePtr будет корректно удалён вместе со своими вложенными нодами (смотрел в дебаге в консоль). как правильно заимплементировать этот класс? спасибо за поправки
В порядке трепа, тк буста развернутого щас нет и проверить в дебуге не могу. Но, кажется, _pNodePtr у вас определен статически, те один для всех экземпляров класса.
_basmp_ вы не правы. для каждой инстации будет свой. и "захватывать" _pNodePtr будет разные объекты Node.
_DEN_ есть юзер-дефайнед ф-ция. мне нужно написать класс описывающий семантику её возвращаемого значения (которое может быть в свою очередь константой, переменной, выражением, или вызовом(ами) этой же/других ф-ций). всё это инкапсулировано в сущность Node. через обычные указатели все работает. т.е. логика класса корректна. я не могу разобраться с тем, как перенести всё это на лыжи умных указателей, чтобы добиться автоматического освобождения памяти, занимаемой передаваемым pNodePtr-ом. ps: рад видеть кстати!
те Node нечто вроде умощненного boost::any, позволяющего передавать сложные данные/ресурсы, в том числе и отложенные/асинхронные/рекурсивные вызовы и корректно освождающего/завершающего все это хозяйство при потере всех ссылок на этот Node, без необходимости его явного удаления? Тогда, имхо, вам надо вводить garbage collector (в бусте есть вроде, или внешний) и освобождать в финализере gc.
_basmp_ т.е. Node вроде обычного класса. ничего сложного нет. все просто. выше буквально все пояснил.
Из того, что есть мало что понятно Почему бы не создать тестовый минимальный пример воспроизводящий ошибку?
все разобралса. оказалос, что еще в одном классе аналогично я храню не weak_ptr, а shared_ptr. переписал с исползованием weak_ptr, и все стало корректно освобождатса. ура! тема закрыта