operator new / delete和类层次结构

时间:2009-10-22 12:46:42

标签: c++

假设我们有类的层次结构,我们希望它们只在整个内存管理器中分配/释放它们的内存。什么是实现此行为的经典C ++方法? 是必须进行额外的检查,例如:

 class Foo{  
  public:  
  virtual ~Foo(){}  
  void* operator new(size_t bytes)  
  {  
    if (bytes != sizeof(Foo)){  
        return ::operator new(bytes);
    }    
    return g_memory_manager.alloc(bytes);  
  }  
  void operator delete(void *space, size_t bytes)  
  {  
    if (bytes != sizeof(Foo)){  
        return ::operator delete(space);  
    }  
    g_memory_manager.dealloc(space, bytes);  
  }  
}

2 个答案:

答案 0 :(得分:2)

不需要检查。

看看Alexandrescu的Loki的SmallObject allocator,你只是继承了SmallObject,它为你做了所有繁重的工作!

不要忘记重载所有新版本并删除:

  • 简易版
  • 阵列版
  • 展示位置版本

否则你可能会有一些麻烦。

答案 1 :(得分:0)

我的评论:

让创作者做这些事情,例如:

template<class t>
struct creator_new { // a creator using new()/delete()
    static t *Create(void) 
    {
        return new t;
    }
    static void Destroy(t *p) 
    {
        delete p;
    }
};

您可以扩展创建者以检查内存泄漏,或使用内存池来管理对象等。