Gamebryo 引擎基础层之efd::MemObject

我们都知道C++中的内存管理是一个很让人头疼的问题,内存泄漏,无效指针访问崩溃,堆内存分配失败,内存碎片等等问题。为了解决这些问题,大部分的游戏引擎都实现了自己的内存管理器。GB中的MemObject 类有点类似于OGRE中的AllocatedObject,所有要从堆内存中构造的对象都必须继承与该类。这个类重载了new和delete操作符,通过自己的内存管理器进行内存的管理。MemObject 接口分为debug和release两种模式,通过EE_MEMORY_DEBUGGER宏我们可以指定debug模式,在这种模式下内存管理器会跟踪所有对象的创建和销毁过程,当发生错误时会把错误的发生点记录在log中,以便于我们进行错误的修改。在这种模式下,需要耗费额外的资源和时间。

 

在实际的使用过程中,我们通过NiNew,NiDelete宏来创建和销毁对象。实现内存管理器最普遍的方法是用使用内存池技术,即一次性批发申请一块较大的内存,然后再把这块较大的内存分成若干小块内存以供使用。这样可以有效地减小内存碎片,提供程序性能,并能够解决内存泄漏的问题。具体的实现代码可以参考boost库中的pool类。

 

GB为了防止无效指针问题,特别引入了NiRefObject类,该类继承自MemObject 。该类增加了引用计数的功能,类似于智能指针。很多情况下,我们需要复制堆指针。复制堆指针是很危险的一种操作,当我们定义一个指向动态对象的指针后,我们因为某种需要必须复制该指针进行相关操作。当我们把原指针delete后,如果我们再使用复制后的指针即会引起程序的崩溃,往往这类错误很难发现。为了避免这种情况,最好使用引用计数的方法,没当复制一个后,引用计数+1.删除的时候必须等到引用计数为0的时候才真正的delete该指针。

你可能感兴趣的:(GameBryo)