如何对我的程序进行编码以便提前灵活地接收自定义分配器?
我编写了一些分配器,但不确定我是否真的需要它 但是,我确信如果我的自定义分配器将被插入,我想在某些特定部分使用它。
例如,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的好教程/信息。
我也读过(他们只是理论的分配器+代码): -
答案 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类换成另一个分配器。