5

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

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

最好的做法是什么?

4

2 回答 2

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){ /*...*/ }
};

Now, if you define a subclass of this you would:

class MyClass : public AbstractMyClass<MyClass> {
};

Thus the new object MyClass will use the specified allocator of the parent class. If you now implement you own allocator you can simply replace either the default template parameter in the super class or you can specify it explicitly in your sub-class.

Using this approach you are more or less safe in using a custom allocator at a later point in time.

于 2012-11-27T10:34:31.880 回答
1

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

您应该改用STL 容器std::vector(而不是new[]/delete[])和智能指针(如shared_ptr,等unique_ptr)。

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

于 2012-10-15T16:23:31.313 回答