我的项目是使用vs2012在c ++ 11中。 现在我觉得不需要使用自定义内存管理,但是我应该采取什么安排来促进最终的未来修改?
我想过为“new”/“new []”/“delete”/“delete []”使用宏,并为容器和智能指针使用typedef。
最佳做法是什么?
答案 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(您可以使用池内存分配等特殊分配技术对其进行自定义。)