创建myNew / myDelete以替换new / new [] / delete / delete []

时间:2017-05-16 04:35:47

标签: c++ memory-management maintainability

如何对我的程序进行编码以便提前灵活地接收自定义分配器?

我编写了一些分配器,但不确定我是否真的需要它  但是,我确信如果我的自定义分配器将被插入,我想在某些特定部分使用它。

示例

例如,int* B::db应使用自定义分配器myNew / myDelete),
 所有std::vector都应使用标准分配器

虽然我仍然没有插入自定义分配器,但我希望我的程序将使用标准new/delete作为默认值。

#define myNew new
#define myDelete delete
class B{ //B should not be a template class
    int* db=nullptr;
    std::vector<float> something; //<- let it use default new/delete
    public: B(){
        db=myNew int[5];   //work like "db=new int[5];"
    }
    public: ~B(){
        myDelete[] db;     //work like "delete[] db;"
    }
};

如果我想稍后插入自定义分配器,我可以更改#define

注意: B不应该是模板类。

问题

我不确定这是否是正确的方法。我对分配器还很新 如果可能的话,我也想避免使用宏 这是一个好的解决方案吗?有没有宏的解决方案吗?

我可以让我的程序只使用new/delete作为默认值,我可以稍后重构它 但是,它可能会成为一项令人心碎的工作。

注意:大多数Q / A似乎都专注于重载全局new/delete。那不是我想要的。 : -

很抱歉,如果这个问题太新手了 我没有找到任何关于在真正的实践中使用allocator的好教程/信息。

我也读过(他们只是理论的分配器+代码): -

1 个答案:

答案 0 :(得分:2)

B可能必须保持非模板。但这并不意味着你不能写一个模板来帮助。而且,当你在这里时,你也可以为RAII提供便利。

template<typename T>
class my_new_heap_array {
  T *ptr;
public:
  operator T*() const { return ptr; }

  my_new_heap_array(std::size_t sz) 
    : ptr(myNew T[sz])
  {}

  ~my_new_heap_array() { myDelete[] ptr; }
};

class B { //B should not be a template class
    my_new_heap_array<int> db;
    std::vector<float> something; //<- let it use default new/delete
    public:
    B()
      :db(5)
    { }
};

一般情况下,只要您考虑到关注点分离,您就会发现更容易更改行为。 B需要决定使用什么分配器,但它不应该关心如何使用它。这种担忧落在助手班上。如果B某天需要使用另一个分配器,那么只需将helper类换成另一个分配器。