2009年1月29日星期四

Nebula3引用计数和智能指针

c++只为在栈上创建的对象才提供自动的生命周期管理。当离开了c++的上下文,栈上的对象将被自动清除掉。

{
//create a new object on the stack
MyObject obj;

//do something with obj...

//current context is left,obj is destroyed automatically
}

当在堆上创建一个对象时,该对象就必须手动删除,否则将出现内存泄露:

{
//create an object on the heap
MyObject *objPtr = new MyObject();

//do something with obj...

//need to manually destroy obj
delete obj;
}

这将使事情变得复杂,当一个c++对象被其它多个对象使用,那么这时就必须要定义所有权规则(拥有该c++对象的类要负责删除该对象,而其它类只是使用该对象)。

在一个复杂的系统中,这种所有权管理将很快变得很棘手。引用计数可以较好地解决这种问题。通过引用计数,不需要定义所有权关系,该对象被使用时就把引用计数增加,当该对象不需要再被使用时就调用Release()方法减少引用计数。当引用计数降为0是,该对象就被删除。这个方法解决了多个对象同时引用一个对象的问题,但还是需要程序员在合适的的时候手动调用Release()方法。

智能指针可以很好地解决第二个问题。智能指针就是一个指向其它c++对象的c++模板对象。管理引用计数的创建,销毁和赋值。很多时候智能指针的使用和普通指针一样,除此之外它修复了普通指针所带来的危险。

让我们看看在Nebula3中是如何实现以上设想的:

{
//create a c++ object on the heap
Ptr<myobject > obj = MyObject.Create();

//do something with obj
obj->DoSomething();

//at the end of context,the smart pointer object is destroyed
//and will release its target object
}

有了智能指针,一个堆对象看起来就像一个栈对象,不需要额外关注对象的释放。智能指针同样很好地解决了指针数组的问题,如果你想创建一个带普通指针的动态数组,你必须在删除数组之前手动地删除数组中的每一个对象,因为当数组被删除时数组中的普通指针指向的对象是不会自动删除的。通过智能指针创建数组,这个问题就能很好地被解决掉。当数组被释放掉时,它将调用容器中的智能指针的析构函数,这样就能释放掉智能指针所指的对象。

{
//create an array of smart pointers
Array <ptr<myobject>> objArray;

//create objects and append to array
int i;
for(i=0;i<10;i++){ href="http://flohofwoe.blogspot.com/2007/01/nebula3-ref-counting-and-smart-pointers.html">Nebula3 ref-counting and smart pointers

[声明]:限于译者水平,文中难免错漏之处,欢迎各位网友批评指正;

没有评论:

发表评论