background image

2. 控制 C++的内存分配
  在嵌入式系统中使用 C++的一个常见问题是内存分配,即对 new   

和 delete 操作

 

符的失控。
  具有讽刺意味的是,问题的根源却是 C++对内存的管理非常的容易而且安全。具体
地说,当一个对象被消除时,它的析构函数能够安全的释放所分配的内存。
    这 当 然 是 个 好 事 情 , 但 是 这 种 使 用 的 简 单 性 使 得 程 序 员 们 过 度 使 用 new   和 
delete,而不注意在嵌入式 C++环境中的因果关系。并且,在嵌入式系统中,由于内存
的限制,频繁的动态分配不定大小的内存会引起很大的问题以及堆破碎的风险。
  作为忠告,保守的使用内存分配是嵌入式环境中的第一原则。
  但当你必须要使用 new 和 delete 时,你不得不控制 C++中的内存分配。你需要用
一个全局的 new 和 delete 来代替系统的内存分配符,并且一个类一个类的重载 new 和
delete。
  一个防止堆破碎的通用方法是从不同固定大小的内存池中分配不同类型的对象。对每
个类重载 new 和 delete 就提供了这样的控制。
2.1 重载全局的 new 和 delete 操作符
  可以很容易地重载 new   

和 delete 操作符,如下所示:

       void * operator new(size_t size)
      {
            void *p = malloc(size);
            return (p);
      }
       void operator delete(void *p);
      {
           free(p);
      } 
  这段代码可以代替默认的操作符来满足内存分配的请求。出于解释 C++的目的,我
们也可以直接调用 malloc() 和 free()。
  也可以对单个类的 new   

和 delete 操作符重载。这是你能灵活的控制对象的内存分

配。
class TestClass {
public:
void * operator new(size_t size);
void operator delete(void *p);
// .. other members here ...
};
void *TestClass::operator new(size_t size)
{
void *p = malloc(size); // Replace this with alternative allocator
return (p);
}
void TestClass::operator delete(void *p)
{
free(p); // Replace this with alternative de-allocator
}