Crea瑩ng Your First OSG Program
[
48 
]
Understanding memory management
In a typical programming scenario, the developer should create a pointer to the root 
node, which directly or indirectly manages all other child nodes of the scene graph. In 
that case, the applica瑩on will traverse the scene graph and delete each node and its 
internal data carefully when they no longer need to be rendered. This process is 瑩resome 
and error-prone, debugging dozens of bad trees and wild pointers, because developers can 
never know how many other objects s瑩ll keep a pointer to the one being deleted. However 
without wri瑩ng the management code, data segments occupied by all scene nodes will never 
be deleted, which will lead to unexpected memory leaks.
This is why memory management is important in OSG programming. A basic concept 
of memory management always involves two topics:
1. Alloca瑩on: Providing the memory needed by an object, by alloca瑩ng the 
required memory block.
2. Dealloca瑩on: Recycling the allocated memory for reuse, when its data is no 
longer used.
Some modern languages, such as C#, Java, and Visual Basic, use a garbage collector to free 
memory blocks that are unreachable from any program variables. That means to store the 
number of objects reaching a memory block, and deallocate the memory when the number 
decrements to zero.
The standard C++ approach does not work in such a way, but we can mimic it by means 
of a smart pointer, which is defined as an object that acts like a pointer, but is much 
smarter in the management of memory. For example, the 
b
o
o
s
t
library provides the 
b
o
o
s
t
:
:
s
h
a
r
e
d
_
p
t
r
<
>
class template to store pointers in order to dynamically allocated 
related objects.
ref_ptr<> and Referenced classes
Fortunately, OSG also provides a na瑩ve smart pointer
o
s
g
:
:
r
e
f
_
p
t
r
<
>
, for the purpose of 
automa瑩c garbage collec瑩on and dealloca瑩on. To make it work properly, OSG also provides 
the 
o
s
g
:
:
R
e
f
e
r
e
n
c
e
d
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 
o
s
g
:
:
r
e
f
_
p
t
r
<
>
class template re-implements a number of C++ operators as well 
as member func瑩ons, and thus provides convenient methods to developers. Its main 
components are as follows:
‹
g
e
t
(
)
: This public method returns the managed pointer, for instance, the 
o
s
g
:
:
N
o
d
e
*
pointer if you are using 
o
s
g
:
:
N
o
d
e
as the template argument.
Pdf rotate single page - Split, seperate PDF into multiple files in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Explain How to Split PDF Document in Visual C#.NET Application
split pdf; acrobat split pdf
Pdf rotate single page - VB.NET PDF File Split Library: Split, seperate PDF into multiple files in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
VB.NET PDF Document Splitter Control to Disassemble PDF Document
break apart a pdf; break pdf file into parts
Chapter 3
[
49 
]
‹
o
p
e
r
a
t
o
r
*
(
)
: This is actually a dereference operator, which returns l-value at the 
pointer address, for instance, the 
o
s
g
:
:
N
o
d
e
&
reference variable.
‹
o
p
e
r
a
t
o
r
-
>
(
)
and 
o
p
e
r
a
t
o
r
=
(
)
: These operators allow a user applica瑩on to 
use 
o
s
g
:
:
r
e
f
_
p
t
r
<
>
as a normal pointer. The former calls member func瑩ons 
of the managed object, and the la瑴er replaces the current managed pointer with  
a new one.
‹
o
p
e
r
a
t
o
r
=
=
(
)
,
o
p
e
r
a
t
o
r
!
=
(
)
, and 
o
p
e
r
a
t
o
r
!
(
)
: These operators help to 
compare smart pointers, or check if a certain pointer is invalid. An 
o
s
g
:
:
r
e
f
_
p
t
r
<
>
object with NULL value assigned or without any assignment is considered 
invalid.
‹
v
a
l
i
d
(
)
: This public method returns true if the managed pointer is not NULL. 
The expression 
s
o
m
e
_
p
t
r
.
v
a
l
i
d
(
)
equals to 
s
o
m
e
_
p
t
r
!
=
N
U
L
L
if 
s
o
m
e
_
p
t
r
is 
defined as a smart pointer.
‹
r
e
l
e
a
s
e
(
)
: This public method is useful when returning the managed address from 
a func瑩on. It will be discussed later.
The 
o
s
g
:
:
R
e
f
e
r
e
n
c
e
d
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 
o
s
g
:
:
N
o
d
e
class actually inherits from 
o
s
g
:
:
R
e
f
e
r
e
n
c
e
d
indirectly. This is the reason 
why we program as follows:
The 
o
s
g
:
:
R
e
f
e
r
e
n
c
e
d
class contains an integer number to handle the memory block 
allocated. The reference count is ini瑩alized to 0 in the class constructor, and will be increased 
by 1 if the 
o
s
g
:
:
R
e
f
e
r
e
n
c
e
d
object is referred to by an 
o
s
g
:
:
r
e
f
_
p
t
r
<
>
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 automa瑩cally destroyed when no longer referenced 
by any smart pointers.
The 
o
s
g
:
:
R
e
f
e
r
e
n
c
e
d
class provides three main member methods:
‹
The public method 
r
e
f
(
)
increases the referenced coun瑩ng number by 1
‹
The public method 
u
n
r
e
f
(
)
decreases the referenced coun瑩ng number by 1
‹
The public method 
r
e
f
e
r
e
n
c
e
C
o
u
n
t
(
)
returns the value of the current 
referenced coun瑩ng number, which is useful for code debugging
These methods could also work for classes that are derived from 
o
s
g
:
:
R
e
f
e
r
e
n
c
e
d
Note that it is very rarely necessary to call 
r
e
f
(
)
or 
u
n
r
e
f
(
)
directly in user programs, 
which means that the reference count is managed manually and may conflict with what the 
o
s
g
:
:
r
e
f
_
p
t
r
<
>
is going to do. Otherwise, OSG's internal garbage collec瑩ng system will 
get the wrong number of smart pointers in use and even crash when managing memory 
blocks in an improper way.
C# PDF Page Rotate Library: rotate PDF page permanently in C#.net
And C# users may choose to only rotate a single page of PDF file or all the pages. See C# programming demos below. DLLs for PDF Page Rotation in C#.NET Project.
c# split pdf; break a pdf apart
VB.NET PDF Page Delete Library: remove PDF pages in vb.net, ASP.
Able to remove a single page from adobe PDF document in VB.NET. using RasterEdge. XDoc.PDF; How to VB.NET: Delete a Single PDF Page from PDF File.
break up pdf file; split pdf into individual pages
Crea瑩ng Your First OSG Program
[
50 
]
Collecting garbage: why and how
Here are some reasons for using smart pointers and the garbage collec瑩on system 
in programming:
‹
Fewer bugs: Using smart pointers means the automa瑩c ini瑩aliza瑩on and cleanup 
of pointers. No dangling pointers will be created because they are always  
reference-counted.
‹
Efficient management: Objects will be reclaimed as soon as they are no 
longer referenced, which gives more available memory to applica瑩ons with  
limited resources.
‹
Easy to debug: We can easily obtain the referenced coun瑩ng number and other 
informa瑩on on objects, and then apply other op瑩miza瑩ons and experiments.
For instance, a scene graph tree is composed by a root node and mul瑩ple levels of child 
nodes. Assuming that all children are managed with 
o
s
g
:
:
r
e
f
_
p
t
r
<
>
, user applica瑩ons 
may only keep the pointer to the root node. As is illustrated by the following image, the 
opera瑩on of dele瑩ng the root node pointer will cause a cascading effect that will destroy 
the whole node hierarchy:
Each node in the example scene graph is managed by its parent, and will automa瑩cally be 
unreferenced during the dele瑩on of the parent node. This node, if no longer referenced by 
any other nodes, will be destroyed immediately, and all of its children will be freed up. The 
en瑩re scene graph will finally be cleaned without worries a晴er the last group node or leaf 
node is deleted.
The process is really convenient and efficient, isn't it? Please make sure the OSG smart 
pointer can work for you, and use a class derived from 
o
s
g
:
:
R
e
f
e
r
e
n
c
e
d
as the 
o
s
g
:
:
r
e
f
_
p
t
r
<
>
template argument, and correctly assign newly-allocated objects to 
smart pointers.
smart pointer can be used either as a local variable, a global variable, or a class member 
variable, and will automa瑩cally decrease the referenced coun瑩ng number when reassigned 
to another object or moved out of the smart pointer's declara瑩on scope.
C# PDF Page Delete Library: remove PDF pages in C#.net, ASP.NET
application. Able to remove a single page from PDF document. Ability Demo Code: How to Delete a Single PDF Page from PDF File in C#.NET. How to
break a pdf password; can't cut and paste from pdf
VB.NET PDF Page Rotate Library: rotate PDF page permanently in vb.
anticlockwise in VB.NET. Rotate single specified page or entire pages permanently in PDF file in Visual Basic .NET. Batch change PDF page
break up pdf into individual pages; break a pdf file into parts
Chapter 3
[
51 
]
It is strongly recommended that user applica瑩ons always use smart pointers to manage  
their scenes, but there are s瑩ll some issues that need special a瑴en瑩on:
‹
o
s
g
:
:
R
e
f
e
r
e
n
c
e
d
and its deriva瑩ves should be created from the heap only. 
They cannot be used as local variables because class destructors are declared 
protected internally for safety. For example:
‹
A regular C++ pointer is s瑩ll workable temporarily. But user applica瑩ons should 
remember to assign it to 
o
s
g
:
:
r
e
f
_
p
t
r
<
>
or add it to a scene graph element 
(almost all OSG scene classes use smart pointers to manage child objects) in the  
end, as it is always the safest approach.
‹
Don't play with reference cycles, as the garbage collec瑩ng mechanism cannot 
handle it. A reference cycle means that an object refers to itself directly or indirectly, 
which leads to an incorrect calcula瑩on of the referenced coun瑩ng number.
The scene graph shown in the following image contains two kinds of reference cycles, which 
are both invalid. The node Child 1.1 directly adds itself as the child node and will form a 
dead cycle while traversing to its children, because it is the child of itself, too! The node 
Child 2.2, which also makes a reference cycle indirectly, will cause the same problem while 
running:
Now let's have a be瑴er grasp of the basic concepts of memory management, through a very 
simple example.
How to C#: Basic SDK Concept of XDoc.PDF for .NET
insert, delete, re-order, copy, paste, cut, rotate, and save or query data and save the PDF document. The PDFPage class presents a single page in a PDFDocument
break apart a pdf file; combine pages of pdf documents into one
VB.NET PDF- View PDF Online with VB.NET HTML5 PDF Viewer
C#.NET PDF file & pages edit, C#.NET PDF pages extract, copy, paste, C#.NET rotate PDF pages, C# Users can view PDF document in single page or continue
break apart pdf pages; break password pdf
Crea瑩ng Your First OSG Program
[
52 
]
Tracing the managed entities
The main point that we are interested in is how 
o
s
g
:
:
r
e
f
_
p
t
r
<
>
binds and handles an 
o
s
g
:
:
R
e
f
e
r
e
n
c
e
d
object, and when the managed object will be destroyed. What we have 
already learnt is: the managed object will be automa瑩cally destroyed when it is no longer 
referenced by any smart pointers, or when its referrer is out of the declara瑩on scope. Now 
let's see how this is performed in prac瑩ce.
Time for action – monitoring counted objects
We will first declare a customized class that is derived from 
o
s
g
:
:
R
e
f
e
r
e
n
c
e
d
. This can 
benefit from the garbage collec瑩ng system by using the smart pointer. A晴er that, let's take 
a look at the ini瑩aliza瑩on and cleanup procedures of our referenced objects.
1.
Include the necessary headers:
#
i
n
c
l
u
d
e
<
i
o
s
t
r
e
a
m
>
2.
Define the customized 
M
o
n
i
t
o
r
i
n
g
T
a
r
g
e
t
class with a unique name, 
_
i
d
. We will 
simply use the standard output to print out verbose informa瑩on when construc瑩ng 
and destruc瑩ng:
{
p
u
b
l
i
c
:
 protected:
     int _id;
}
;
3.
In the main func瑩on, we will first create a new 
M
o
n
i
t
o
r
i
n
g
T
a
r
g
e
t
object, and 
assign it to two different smart pointers, 
t
a
r
g
e
t
and 
a
n
o
t
h
e
r
T
a
r
g
e
t
, and see if 
the referenced count changed:
C# PDF Convert to Tiff SDK: Convert PDF to tiff images in C#.net
Both single page and multipage tiff image files can be created from PDF. Supports tiff compression selection. Supports for changing image size.
pdf format specification; acrobat split pdf bookmark
VB.NET PDF: Basic SDK Concept of XDoc.PDF
insert, delete, re-order, copy, paste, cut, rotate, and save or query data and save the PDF document. The PDFPage class presents a single page in a PDFDocument
reader split pdf; split pdf into multiple files
Chapter 3
[
53 
]
4.
A second experiment is to create new objects in a cycle, but never delete them. 
Do you think this will cause memory leaks or not?
{
}
5.
The result is printed as shown in the following screenshot. As the construc瑩on 
and destruc瑩on processes both write to the standard output, a list of texts will  
be produced in the console.
W
h
a
t
j
u
s
t
h
a
p
p
e
n
e
d
?
A new 
M
o
n
i
t
o
r
i
n
g
T
a
r
g
e
t
object was created with the ID 0 and assigned to the smart 
pointer 
t
a
r
g
e
t
. Another smart pointer
a
n
o
t
h
e
r
T
a
r
g
e
t
, immediately refers to the 
target and thus increases the referenced count of the 
M
o
n
i
t
o
r
i
n
g
T
a
r
g
e
t
object to 2, 
which means that the object is referenced by two smart pointers at the same 瑩me. It  
won't be deleted un瑩l all referrers are redirected or destroyed, as illustrated:
VB.NET PDF File & Page Process Library SDK for vb.net, ASP.NET
With VB.NET PDF SDK, PDF document page can be rotated to 90, 180, and 270 in clockwise. Both a single page and whole file pages can be rotated and saved as
pdf will no pages selected; break pdf into multiple pages
VB.NET PDF File Merge Library: Merge, append PDF files in vb.net
all. This guiding page will help you merge two or more PDF documents into a single one in a Visual Basic .NET imaging application.
break a pdf file; break a pdf into separate pages
Crea瑩ng Your First OSG Program
[
54 
]
A晴er that, we were going to try construc瑩ng 
M
o
n
i
t
o
r
i
n
g
T
a
r
g
e
t
objects with the ID 1 
to 4 in a cycle. Every 瑩me, the allocated object was set to an 
o
s
g
:
:
r
e
f
_
p
t
r
<
>
pointer, 
but without any explicit dele瑩on. You will no瑩ce that the 
M
o
n
i
t
o
r
i
n
g
T
a
r
g
e
t
object was 
automa瑩cally deleted at the end of each loop, and would never cause memory leaks.
Another interes瑩ng issue is to decide the best 瑩me to actually delete an unreferenced 
object. Most 
o
s
g
:
:
R
e
f
e
r
e
n
c
e
d
-based classes define their destructors as protected 
members, so the C++ 
d
e
l
e
t
e
operator can't be used directly in user programs. The dele瑩on 
process will be performed internally when the reference count decreases to 0. But this 
may s瑩ll cause serious problems if some other threads are working on the object at the 
same 瑩me when it is being deleted. That is to say, the garbage collec瑩ng system may not be 
thread-safe for massive use!
Fortunately, OSG has already provided an object dele瑩on scheduler in response to the 
problem. This dele瑩on scheduler, named 
o
s
g
:
:
D
e
l
e
t
e
H
a
n
d
l
e
r
, will not perform the 
dele瑩ng opera瑩on at once, but defer it for a while. All objects to be deleted will be stored 
temporarily, un瑩l it is a safe 瑩me to release them. The 
o
s
g
:
:
D
e
l
e
t
e
H
a
n
d
l
e
r
class is 
managed by the OSG rendering backend. User applica瑩ons should always pay li瑴le a瑴en瑩on 
to this class, unless you have to implement another dele瑩on handler yourselves, some day.
Have a go hero – returning from a function
We have already men瑩oned that there is a 
r
e
l
e
a
s
e
(
)
method that can be used when 
returning from a func瑩on. The following code will tell more about its usage:
{
}
Try replacing the 
n
e
w
M
o
n
i
t
o
r
i
n
g
T
a
r
g
e
t
(
i
)
statements in the last example with this 
func瑩on. It is for the purpose of returning from a func瑩on and has no side effects.
Pop quiz – release a smart pointer
The 
r
e
l
e
a
s
e
(
)
method of 
o
s
g
:
:
r
e
f
_
p
t
r
<
>
will prevent the smart pointer from 
managing the memory that it points to. In the func瑩on men瑩oned in the Have a go hero 
sec瑩on, 
r
e
l
e
a
s
e
(
)
will first decrease the reference count to 0. A晴er that, instead of 
dele瑩ng the memory, it directly returns the actual pointer. As long as the calling code stores 
the returned pointer in another 
o
s
g
:
:
r
e
f
_
p
t
r
<
>
, there will be no memory leaks.
Chapter 3
[
55 
]
So, what will happen if the func瑩on returns 
t
a
r
g
e
t
.
g
e
t
(
)
instead of 
t
a
r
g
e
t
.
r
e
l
e
a
s
e
(
)
Can you figure out why 
r
e
l
e
a
s
e
(
)
is always preferred for returning the allocated address in a 
func瑩on?
Parsing command-line arguments
Command-line arguments to the main func瑩on define different parameters for user 
applica瑩ons. The main func瑩on declara瑩on always looks like this:
The 
a
r
g
c
and 
a
r
g
v
arguments form a string array containing the applica瑩on name and 
other necessary arguments. OSG provides a fast and safe 
o
s
g
:
:
A
r
g
u
m
e
n
t
P
a
r
s
e
r
to read 
and make use of them.
Time for action – reading the model filename from the 
command line
The most common public method of 
o
s
g
:
:
A
r
g
u
m
e
n
t
P
a
r
s
e
r
is the overloaded 
r
e
a
d
(
)
func瑩on. In this example, we are going to read command-line arguments with a special 
format and apply the parsing result to the 
func瑩on.
1.
Include the necessary headers:
2.
In the main func瑩on, try reading 
-
-
m
o
d
e
l
and the 
f
i
l
e
n
a
m
e
from the 
input arguments:
s
t
d
:
:
s
t
r
i
n
g
f
i
l
e
n
a
m
e
;
3.
Read 
N
o
d
e
from the specified file and ini瑩alize the viewer. This is very similar to 
some previous examples except that it replaces the 
c
o
n
s
t
string 
"
C
e
s
s
n
a
.
o
s
g
"
with a 
s
t
d
:
:
s
t
r
i
n
g
variable:
r
e
t
u
r
n
v
i
e
w
e
r
.
r
u
n
(
)
;
Crea瑩ng Your First OSG Program
[
56 
]
4.
Build and start this example! Assuming that your executable file is 
M
y
P
r
o
j
e
c
t
.
e
x
e
type the following command in the prompt:
5.
We will see more than a Cessna model now. It is a dump truck loaded from the 
disk! Please be aware that you should have the OSG sample data installed, and  
the environment variable 
O
S
G
_
F
I
L
E
_
P
A
T
H
set.
W
h
a
t
j
u
s
t
h
a
p
p
e
n
e
d
?
The dump truck model is loaded and rendered on the screen. Here, the most important 
point is that the filename 
d
u
m
p
t
r
u
c
k
.
o
s
g
is obtained from the command-line argument. 
The 
r
e
a
d
(
)
func瑩on, which consists of a format string parameter and a result parameter, 
helps to successfully find the first occurrence of the user-defined op瑩on 
-
-
m
o
d
e
l
and the 
filename argument that follows.
The 
r
e
a
d
(
)
func瑩on of the 
o
s
g
:
:
A
r
g
u
m
e
n
t
P
a
r
s
e
r
class is overloaded. You may obtain 
integers, float and double values, and even mathema瑩cal vectors, in addi瑩on to strings,  
from its parameters. For instance, to read a customized op瑩on 
-
-
s
i
z
e
with a single 
precision value from the command line, just use the following code:
f
l
o
a
t
s
i
z
e
=
0
.
0
f
;
The ini瑩al value of 
s
i
z
e
will not be changed if there is no such argument, 
-
-
s
i
z
e
.
Chapter 3
[
57 
]
Tracing with the notifier
The OSG no瑩fier mechanism provides a novel method of outpu瑴ng verbose debugging 
messages, either from the OSG rendering backend or from the user level. It is really an 
important and 瑩me-honored method for tracing and debugging programs. In addi瑩on, the 
no瑩fier is also used throughout the OSG core func瑩onali瑩es and plugins to show errors, 
warning messages, or informa瑩on about the work in progress. Developers may simply 
insert debugging print func瑩ons liberally in the source code files. The print func瑩on, 
o
s
g
:
:
n
o
t
i
f
y
(
)
, is designed to accept different levels of messages and send them to the 
console or user-defined controllers.
The 
o
s
g
:
:
n
o
t
i
f
y
(
)
func瑩on can be used as the standard output stream 
s
t
d
:
:
c
o
u
t
. It 
requires a 
N
o
t
i
f
y
S
e
v
e
r
i
t
y
argument to indicate the message level, which can be 
A
L
W
A
Y
S
F
A
T
A
L
W
A
R
N
N
O
T
I
C
E
I
N
F
O
D
E
B
U
G
_
I
N
F
O
, and 
D
E
B
U
G
_
F
P
, sorted from the most severity 
to the least. For instance:
This will print out a line of the warning message by default. Here 
o
s
g
:
:
W
A
R
N
is used to 
indicate the no瑩fy level to the OSG no瑩fier system.
A series of macro defini瑩ons, such as 
O
S
G
_
F
A
T
A
L
O
S
G
_
W
A
R
N
, and 
O
S
G
_
N
O
T
I
C
E
, will do the 
same work as the 
o
s
g
:
:
n
o
t
i
f
y
(
)
func瑩on, with different severity levels.
Redirecting the notifier
The OSG output message always includes important informa瑩on about the running 
state, graphics system extensions, and possible problems in the OSG backend and user 
applica瑩ons. This is also important as a reference source for debugging OSG-based programs.
In some cases, there is no console output in an applica瑩on, which prevents us from  
reading no瑩fier messages and finding possible bugs. However, the 
o
s
g
:
:
N
o
t
i
f
y
H
a
n
d
l
e
r
derived class can be used to redirect the no瑩fier to another output stream, such as files  
or GUI widgets.
Documents you may be interested
Documents you may be interested