Angus Leeming <[EMAIL PROTECTED]> writes: | Lots and lots of things are caching a BufferView * or a Buffer *. To name a | few: | InsetFormulaBase (BufferView *) | InsetCite (Buffer *) | GraphicsLoader (BufferView *, cached for 2 secs then used). > | Moreover, InsetGraphics and InsetInclude both are using current_view because | they don't cache but should. In the case of InsetInclude that's preview | related so it's not yet in cvs. > | Clearly when we move to multiple / changing BufferViews this is going to lead | to nasty problems. > | Lars has mentioned using boost::weak_ptr in just such a context and I'd like | to do so here. From the boost docs > | ========================================= | http://www.boost.org/libs/smart_ptr/weak_ptr.htm > | The weak_ptr class template stores a pointer to an object that's already | managed by a shared_ptr. When the object last shared_ptr to the object goes | away and the object is deleted, all weak_ptr objects have their stored | pointers set to 0. | ========================================= > | I'd like, therefore, to change the LyXView store | public: | /// return the current buffer view | BufferView * view() const { return bufferview_,get(); }
I'd rather change this one to a. return a shared_ptr b. return a weak_ptr | + /// weak_ptr.get() is reset to 0 automatically when bufferview_ is killed. | + boost::weak_ptr<BufferView> const cachablePtr() const { | + return boost::weak_ptr<BufferView>(bufferview_); | + } and not have this one at all. | private: | /// view of a buffer. Eventually there will be several. | - boost::scoped_ptr<BufferView> bufferview_; | + boost::shared_ptr<BufferView> bufferview_; yes. | and to make it accessible through BufferView: | boost::weak_ptr<BufferView> const BufferView::cachablePtr() const | { | return pimpl_->owner_->cachablePtr(); | } and you really need this? -- Lgb