Open Cascade中的内存管理

Memory Management in Open Cascade

eryar@163.com

一、C++中的内存管理 Memory Management in C++

1. 引言

为了表现出多态,在C++中就会用到大量的指针和引用。指针所指的对象是从内存空间中借来的,当然要及时归还。特别是指针在程序中随心所欲地创建,因此,一个指针究竟指向哪个对象,一个对象到底被几个指针所指向,是程序员十分关注的事情。

C++中涉及到的内存管理问题可以归结为两方面:正确地掌握它和有效地使用它。好的程序员会理解这两个问题为什么要以这样的顺序列出。因为执行得再快、体积再小的程序,如果不按所期望的方式去执行也是没什么用处的程序。对于大多数程序员,正确地掌握意味着正确地调用内存分配和释放函数;有效地使用意味着编写自定义版本的内存分配和释放函数。显然,正确地掌握它要重要些。

C中,只要用malloc分配的内存没有用free释放就会产生内存泄露。在C++中肇事者的名字换成了newdelete,但是问题依然存在。当然,有了析构函数情况稍有改观。因为析构函数为所有将被销毁的对象提供了一个方便的调用delete的场所,但这同时又带来了更多的烦恼,因为newdelete是隐式地调用构造函数和析构函数的。而且可以在类中和类外自定义newdelete操作符,这又带来了复杂性,增加出错的机会。

2. 内存分配方式

内存分配有三种方式:

u 从静态存储区域分配。内存在编译时就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量、static变量;

u 从栈上分配。在执行函数时,函数内的局部变量的存储单元都能在栈上创建,函数执行结束时,这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配内存容量有限;

u 从堆上分配,亦称动态内存分配。程序在运行时用mallocnew申请任意多少的内存,程序员自己负责在用完时使用freedelete来释放内存。动态内存的生存期由我们决定,使用起来很灵活,但问题也最多。

二、Open Cascade中的内存管理 Memory Management in Open Cascade

在几何建模的过程中,程序创建和删除了大量的对象在动态内存中,也就是堆中。在这种情况下,标准C++的内存管理方式不是很高效,所以Open Cascade在包Standard中专门写了个内存管理程序(Memory Manager)来对内存的分配与删除进行管理。

1. 用法 Usage

为了在C代码中使用Open Cascade提供的内存管理器,只需要将原来使用malloc的地方使用Standard::Allocate来代替,原来使用free的地方使用Standard::Free来代替。另外,原来使用realloc的地方使用Standard::Reallocate来代替即可。

C++中,operator newdelete都重新定义以便使用Open Cascade的内存管理器。定义代码如下所示:

public:
  // Redefined operators new and delete ensure that handles are 
  // allocated using OCC memory manager
  void* operator new(size_t,void* anAddress) 
  {
    return anAddress;
  }

  void* operator new(size_t size) 
  { 
    return Standard::Allocate(size); 
  }

  void  operator delete(void *anAddress, size_t ) 
  { 
    if (anAddress) Standard::Free(anAddress); 
  }
View Code

相关文章: