条款9: 避免隐藏标准形式的new
#include <cstddef>
#include <new>
#include <iostream>
class MyClass {
public:// 用户定义的带有参数的 operator newstatic 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 newusing ::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 newMyClass* obj2 = new(10) MyClass; // 使用自定义的 operator newdelete obj1;delete obj2;return 0;
}
条款10: 如果写了operator new就要同时写operator delete
方便自己管理内存,减少内存附加的信息(例如小对象的size信息)。
具体估计得根据编译器实现去检查衡量大量小对象的new、delete细节。
内存池需要考虑自己写对称的new、delete。