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

时间:2012-10-15 16:17:29

标签: c++ memory-management c++11

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

我想过为“new”/“new []”/“delete”/“delete []”使用宏,并为容器和智能指针使用typedef。

最佳做法是什么?

2 个答案:

答案 0 :(得分:2)

从我的观点来看,你所要做的就是基本上决定你将在整个实施过程中使用的某个约定。让您的架构分配器知道的一个好模板是查看如何实现STL容器,并尝试设计类似它们的数据结构。如果您在std::vector接口上查找示例,则此容器的第二个参数始终是Allocator类型。 分配器必须遵循某个interface,这样才能轻松地将自定义替换默认分配器实现。

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

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

现在,如果你定义了这个的子类,你会:

class MyClass : public AbstractMyClass<MyClass> {
};

因此,新对象MyClass将使用父类的指定分配器。如果现在实现自己的allocator,只需替换超类中的默认模板参数,或者可以在子类中明确指定它。

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

答案 1 :(得分:1)

在现代C ++代码中,new/new[]/delete/delete[]应该很少。 事实上,它们容易泄漏,而且不安全;此外,一般来说,拥有原始指针应该限制在RAII类中,并使用适当的析构函数进行清理。

您应该使用 STL容器,例如std::vector(而不是new[]/delete[]),智能指针,例如shared_ptr,{ {1}}等等。

对于STL容器,它们支持自定义内存分配。 有关框架自定义分配器的示例,请参阅Mallocator(您可以使用池内存分配等特殊分配技术对其进行自定义。)