条款9: 避免隐藏标准形式的new
#include
#include
#include
class MyClass {
public:
// 用户定义的带有参数的 operator new
static void* operator new(std::size_t size, int extra) {
std::cout << "Custom new with extra parameter\n";
void* p = ::operator new(size);
return p;
}
// 使用 using 语句,明确地指出我们还想使用标准的 operator new
using ::operator new; //只要这一句也可以
static void * operator new(size_t size){ //定义inline函数也可以
return ::operator new(size);
}
MyClass() {
std::cout << "MyClass constructor\n";
}
};
int main() {
MyClass* obj1 = new MyClass; // 使用标准的 operator new
MyClass* obj2 = new(10) MyClass; // 使用自定义的 operator new
delete obj1;
delete obj2;
return 0;
}
条款10: 如果写了operator new就要同时写operator delete
方便自己管理内存,减少内存附加的信息(例如小对象的size信息)。
具体估计得根据编译器实现去检查衡量大量小对象的new、delete细节。
内存池需要考虑自己写对称的new、delete。