准备最终的未来自定义内存分配器

キキジ*_*キジキ 5 c++ memory-management c++11

我的项目是使用vs2012的c ++ 11.现在我觉得不需要使用自定义内存管理,但是我应该采取什么安排来促进最终的未来修改?

我想为一个宏使用"new"/"new []"/"delete"/"delete []"和typedef用于容器和智能指针.

什么是最佳做法?

gru*_*zip 2

从我的角度来看,您所要做的基本上就是决定在整个实现过程中使用的某种约定。让您的架构分配器了解的一个好模板是查看 STL 容器如何实现这一点,并尝试设计像它们一样的数据结构。例如,如果您在std::vector接口上查找,则该容器的第二个参数始终是分配器类型。分配器必须遵循特定的接口,该接口将允许用自定义分配器实现轻松替换默认分配器实现。

但回到您编写的代码:在我从事的一个项目中,我们将其定义如下。对于应该消耗大量内存的对象,我们定义一个模板化超类,它允许指定自定义分配器。

template<class AllocatedClass, typename Allocator=std::allocator<AllocatedClass>
class AbstractMyClass {
public:
 static void *operator new(size_t sz){ /*...*/ }
 static void operator delete(void *p){ /*...*/ }
};
Run Code Online (Sandbox Code Playgroud)

现在,如果您定义它的子类,您将:

class MyClass : public AbstractMyClass<MyClass> {
};
Run Code Online (Sandbox Code Playgroud)

因此,新对象MyClass将使用父类的指定分配器。如果您现在实现自己的分配器,您可以简单地替换超类中的默认模板参数,也可以在子类中显式指定它。

使用这种方法,您在稍后的时间点使用自定义分配器或多或少是安全的。