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

Create myNew/myDelete to replace new/new[]/delete/delete[]

如何将我的程序编码为可以灵活地提前接收自定义分配器?

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

例子

例如,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 不应该是模板 class.

问题

我不确定这是否正确。我对分配器还是很陌生。
我也想尽可能避免宏。
这是一个好的解决方案吗?有没有不用宏的解决方案?

我可以让我的程序默认只使用new/delete,以后我可以重构它。
不过,估计以后会是一部脑残作品吧。

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

对不起,如果这个问题太新手了。
真实 实践中,我没有发现任何关于使用分配器的好处 tutorial/information。

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

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 需要决定使用什么分配器,但不应该关心如何使用它。这个问题落在了帮手 class 身上。如果某天 B 需要使用另一个分配器,则只需将助手 class 切换为另一个。