class使用定制的内存类重载new和delete vs placement new

时间:2013-04-24 13:54:16

标签: c++ memory-management new-operator delete-operator

我正在调查使用课程重载新闻和删除与展示位置新闻之间的利弊。我的意思是,要么声明我可能希望新建的每个类,并使用自己的运算符重载进行删除,要么使用内存管理器通过新的位置为我提供所需的内存。

我有一个内存管理器,允许我从多个池中分配内存:

enum MemPool
{
  kPool1,
  kPool2,
}

class MemoryManager
{
public:
  template <typename T>
  void* Allocate(MemPool pool); 
  void  Remove(MemPool pool, void* ptr);

};

MemoryManager g_mmgr;

Allocate是模板化的,因为在调试模式下我存储了每个分配的名称(通过typeid(T).name()),我可以通过sizeof(T)得到每个分配的大小

我认为自己至少有2个关于如何分配的选项,并且我正在尝试确定哪个在语法用法,效率,安全性和可移植性方面最佳。

选项1是一个带有新闻和删除的模板化基类,它包装了mempool并为我输入。

template <typename T, MemPool pool>
class MemPoolUser
{
public:
  static void* operator new(int size)
  {
    return g_mmgr.Allocate<T>(pool);
  }

  static void operator delete(void* ptr)
  {
    g_mmgr.Remove(pool,ptr);
  }
};

然后我可以确保通过MemoryManager可能需要新建的每个类都被声明:

class MyClass : public MemPoolUser<MyClass, kPool1>
{

};

这将允许我简单地做

MyClass* c = new MyClass();
...
delete c;

将调用MemPoolUser中正确的new和delete。

选项2是使用展示位置新闻:

class MyClass
{

};

MyClass* c = new (g_mmgr.Allocate<MyClass>(kPool1)) MyClass();
....
c->~MyClass();
g_mmgr.Remove(kPool1,c);

这些选项的优缺点是什么?选项1似乎更整洁,但我必须知道我希望每个类分配的mempool的类型,这可能取决于其他运行时因素。

选项2更灵活,但新增和删除在语法上很难看(它可能包含在#defines中)

所以我的问题是,除了上面提到的问题之外,还有什么我没有考虑过这两个选项而且比另一个更危险吗?

1 个答案:

答案 0 :(得分:0)

如果你必须首先这样做(我希望你有一些相当不错的用例,其中对这些对象有一些特定需要特定的内存池),我肯定会去{{1 }和operator new解决方案。它允许使用此代码的应用程序代码使用最少量的额外编码编写,超出典型代码。