创建 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
。那不是我想要的。 :-
- overloading new/delete
- How to properly replace global new & delete operators
- Using operator new and operator delete with a custom memory pool/allocator
对不起,如果这个问题太新手了。
在 真实 实践中,我没有发现任何关于使用分配器的好处 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 切换为另一个。
如何将我的程序编码为可以灵活地提前接收自定义分配器?
我编写了一些分配器,但不确定我是否真的需要它。
但是,我确信如果我的自定义分配器将被插入,我想在某些特定部分使用它。
例子
例如,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
。那不是我想要的。 :-
- overloading new/delete
- How to properly replace global new & delete operators
- Using operator new and operator delete with a custom memory pool/allocator
对不起,如果这个问题太新手了。
在 真实 实践中,我没有发现任何关于使用分配器的好处 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 切换为另一个。