<div dir="ltr">Hi Thibault<br><br>Thanks a lot, this will help me.<br>I understand that the ref_ptr is not needed everywhere, but sometimes it becomes very difficult to undestand if a ref_ptr is needed or if a pointer will be sufficient or safety.<br>
<br>Thanks for your help.<br><br>Regards,<br>   Vincent.<br><br><div class="gmail_quote">2008/9/23 Thibault Genessay <span dir="ltr"><<a href="mailto:tibogens@gmail.com">tibogens@gmail.com</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi Vincent<br>
<div class="Ih2E3d"><br>
On Mon, Sep 22, 2008 at 5:23 PM, Vincent Bourdier<br>
<<a href="mailto:vincent.bourdier@gmail.com">vincent.bourdier@gmail.com</a>> wrote:<br>
> Hi all,<br>
><br>
> I read that all the objects that inherit from Referenced need to be in a<br>
> ref_ptr.<br>
<br>
</div>They don't _need_ to. You can perfectly use a raw pointer to an<br>
osg::Referenced instance, e.g. create a new node:<br>
MyNode* node = new MyNode();<br>
myscene->addChild(node);<br>
You have to be aware that if an exception is thrown (or any event that<br>
could cause the addChild() call to be skipped) before the node is<br>
added to the parent the memory will not be freed - group nodes keep<br>
ref_ptr<>s to their children, and once the node is added to 'myscene'<br>
it will be managed by the ref_ptr mechanism.<br>
<br>
The general rule is to use raw pointers only when you do trivial<br>
things (e.g. creating an instance provided that the constructor cannot<br>
throw) or when you know that your object is already referenced from<br>
somewhere else (e.g. like in osg::Node* node = myscene->getChild(0)).<br>
Use ref_ptrs as class members (*) (e.g. have a look at osg::Group) and<br>
when things are more complicated, especially w.r.t exceptions that<br>
could be thrown in the meantime.<br>
<div class="Ih2E3d"><br>
> Ok that sounds good , but :<br>
><br>
> In this case I don't know if I need to put the ref_prt in argument or if<br>
> only the ptr is needed.<br>
<br>
</div>It's not a good idea to use ref_ptr<> in arguments. If your function looks like<br>
void setFooState(ref_ptr<Node> arg) { // add the foo state to the<br>
node's stateset  }<br>
And you call it this way:<br>
osg::Node* node = new MyNode();<br>
setFooState(node);<br>
then a ref_ptr will be implicitly created. It will ref() the node, do<br>
whatever it needs to do with it and unref() it before it returns to<br>
the caller. Since the node was not referenced from somewhere else, it<br>
will be deleted and your 'node' pointer will be a dangling pointer -<br>
which is certainly not what you want.<br>
<br>
OTOH, if your function is defined as<br>
void setFooState(osg::Node* arg) {...}<br>
you can safely call either<br>
setFooState(node); if you have a raw pointer to your node<br>
or<br>
setFooState(node.get()); if you have a ref_ptr to your node<br>
<br>
Hope this helps<br>
<br>
Thibault<br>
<br>
(*) Keep in mind that your (scene) graph must be acyclic w.r.t to<br>
ref_ptr<>s: if A holds a ref_ptr to B then neither B nor its children<br>
must hold a ref_ptr to A. This is why Groups have an<br>
std::vector<ref_ptr<Node> > to their children, and Nodes have an<br>
std::vector<Node*> to their parents.<br>
_______________________________________________<br>
osg-users mailing list<br>
<a href="mailto:osg-users@lists.openscenegraph.org">osg-users@lists.openscenegraph.org</a><br>
<a href="http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org" target="_blank">http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org</a><br>
</blockquote></div><br></div>