如何编写我的程序以灵活地提前接收自定义分配器?
我编写了一些分配器,但不确定我是否真的需要它。
但是,我确信如果我的自定义分配器将被插入,我想在某些特定部分使用它。
示例
例如,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
,然后我可以重构它。
不过,以后可能会是一件很伤脑筋的工作。
注意:大多数问答似乎都集中在重载全局new/delete
。那不是我想要的。 :-
- overloading new/delete
- How to properly replace global new & delete operators
- Using operator new and operator delete with a custom memory pool/allocator
抱歉,如果这个问题太新手了。
我还没有找到任何关于在真实实践中使用分配器的好的教程/信息。
我也读过(它们只是分配器+代码的理论):-
最佳答案
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 需要使用另一个分配器,那么只需将辅助类切换为另一个分配器即可。
关于c++ - 创建 myNew/myDelete 替换 new/new[]/delete/delete[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43992580/