20.超级指针(难点)
关于超级指针的问题由来已久,用的颇广。在 OSG 中问题是这样提出来的,有这样一个场景,有一辆卡车, 卡车上有一个箱子。如果说卡车在运行过程中,箱子突然掉了,这样就知道该把箱子的结点删除。那么如 果说还有一个箱子,在地上放着,从感觉上来讲他们应该用同一块内存。卡车上的箱子虽然掉了,但是地 上的箱子还在,所以箱子所占的资源不能被粗鲁的释放掉。
这样就引用了超级指针的机制,其实就是引用一个计数器,这个计数器会计算这个箱子被引用的次数,被 别人引用一次这个计数器增加一,别人不用一次,即:释放一次,则计数器减一。当减至 0 时,内存放掉 不用。
21.超级指针详解 (难点)
内容来自 OpenSceneGraph基本渲染理论
Leandro Motta Barros
Start: August 17th 02005
译:FreeSouth
让我们来以一个定义开讲:一个 资源 必须在它被使用之前被申请,而在它使用之后不久被释放,也许我们有很多的应用程
序在使用同一片资源,一个不需要了而另一个却还需要使用这片资源。这两种情况都涉及到页面(在打开前必须处于关闭状态)
和数据的移动(在移动前可能被加锁或做一些包裹处理)。在 OpenGL 当中,也同样有一些关于申请与释放资源的例子(一个示例是纹理函数的名称被命名为 glGenTextures(), 它就必须被函数 glDeleteTextures()释放)。
在事物扩展的事例当中,事物拥有者使用 AllocateTing()来分配该事物, 然后拥有者便有责任来管理他们的分配与释放操作。
在 OSG 当中,有一些稍微有些复杂的细节来实现这些操作,也就是一些事物可能有多个拥有者。比如,在场景图 1.7 所示当中,
类 osg::geode 中含有 box 绑定到两个父结点身上,到底哪个负责他们的分配与释放操作呢。
在这种情况之下,只要还有一个引用指向该资源,该资源就不应该被释放。所以,大多数的 OSG 对象都有一个内部的计数
器用来计算有多少个指针指向它。当没有指针指向该资源(同样,可以称做对象)时,它的计数器会变为 0,当计算器为 0 时就
可以放掉对象。
幸运的是,我们程序员不需要手工的来维护这些引用计数:这就是超级指针为什么存在的原因。在 OSG 当中超级指针被一
个称为 osg::ref_ptr<>的类模版来实现。无论在什么时候,只要该对象被引用,则在 osg::ref_ptr<>当中的计数器会自动增加, 通过这种方式实现了资源的自动管理,当不需要使用它时,它会在不久后释放,在申请它时会自动分配空间。
22.超级指针代码解释
下面这个例子会示例如何使用 OSG 的超级指针,例子中有一些代码如下所示:
SmartPointers.cpp
1 #include <cstdlib>
2 #include <iostream>
3 #include <osg/Geode>
4 #include <osg/Group>
5
6 void MayThrow()
7 {
8 if (rand() % 2)
9 throw "Aaaargh!";
10 }
11
12 int main()
13 {
14 try
15 {
16 srand(time(0));
17 osg::ref_ptr<osg::Group> group (new osg::Group());
18
19 // This is OK, albeit a li