- OpenSceneGraph 3.0: Beginner's Guide
- Rui Wang Xuelei Qian
- 488字
- 2021-03-27 00:35:42
ref_ptr<> and Referenced classes
Fortunately, OSG also provides a native smart pointer, osg::ref_ptr<>
, for the purpose of automatic garbage collection and deallocation. To make it work properly, OSG also provides the osg::Referenced
class to manage reference-counted memory blocks, which is used as the base class of any classes that may serve as the template argument.
The osg::ref_ptr<>
class template re-implements a number of C++ operators as well as member functions, and thus provides convenient methods to developers. Its main components are as follows:
get():
This public method returns the managed pointer, for instance, theosg::Node*
pointer if you are usingosg::Node
as the template argument.operator*():
This is actually a dereference operator, which returns l-value at the pointer address, for instance, theosg::Node&
reference variable.operator->()
andoperator=():
These operators allow a user application to useosg::ref_ptr<>
as a normal pointer. The former calls member functions of the managed object, and the latter replaces the current managed pointer with a new one.operator==(), operator!=()
, andoperator!():
These operators help to compare smart pointers, or check if a certain pointer is invalid. Anosg::ref_ptr<>
object with NULL value assigned or without any assignment is considered invalid.valid():
This public method returns true if the managed pointer is not NULL. The expressionsome_ptr.valid()
equals tosome_ptr!=NULL
ifsome_ptr
is defined as a smart pointer.release():
This public method is useful when returning the managed address from a function. It will be discussed later.
The osg::Referenced
class is the pure base class of all elements in a scene graph, such as nodes, geometries, rendering states, and any other allocatable scene objects. The osg::Node
class actually inherits from osg::Referenced
indirectly. This is the reason why we program as follows:
osg::ref_ptr<osg::Node> root;
The osg::Referenced
class contains an integer number to handle the memory block allocated. The reference count is initialized to 0 in the class constructor, and will be increased by 1 if the osg::Referenced
object is referred to by an osg::ref_ptr<>
smart pointer. On the contrary, the number will be decreased by 1 if the object is removed from a certain smart pointer. The object itself will be automatically destroyed when no longer referenced by any smart pointers.
The osg::Referenced
class provides three main member methods:
These methods could also work for classes that are derived from osg::Referenced
. Note that it is very rarely necessary to call ref()
or unref()
directly in user programs, which means that the reference count is managed manually and may conflict with what the osg::ref_ptr<>
is going to do. Otherwise, OSG's internal garbage collecting system will get the wrong number of smart pointers in use and even crash when managing memory blocks in an improper way.