C++允许重载多个版本new()和delete()
但是重载的对象必须有独特的参数列
(1)new第一个参数必须是size_t
(2) delete 和 new 最好配对使用,但是若没用,编译器也不会error
成员operator new / delete
- 构造对象过程解析(2步)
try {
void* mem=operator new(sizeof(foo)); //(1)先分配内存
p=static_cast<foo*>(mem);
p->foo::foo(); //(2)调用构造
}
- 析构对象解析 (2步)
p->~foo();(1)先调用析构
operator delete§;(2)再释放内存
class foo{
public:
void* operator new(size_t);
void* operator delete(void*,size_t) //size_t is a optional;
};
int main()
{
foo* p=new foo;
/*
. . .
*/
delete p;
return 0;
// 伪代码
}
成员operator new [ ] / delete [ ]
分析过程类型于上面(仅在大小,调用次数不同而已)
class foo{
public:
void* operator new[](size_t);
void* operator delete[](void*,size_t) //size_t is a optional;
};
int main()
{
foo* p=new foo[n]; //n is the array size
/*
. . .
*/
delete p;
return 0;
}
try {
void* mem=operator new(sizeof(foo)*n+4);
p=static_cast<foo*>(mem);
p->foo::foo(); // n 次
}
p->~foo(); // n 次
operator delete(p);
全局作用域 ::operator new delete
直接看下面的实例代码即可:
new 参数传递大小size
delete 传递指针(地址)
(内部依然是包裹着malloc,free)
void* my_alloc(size_t size)
{
return malloc(size);
}
void* my_free(void* ptr)
{
return free(ptr);
}
inline
void* operator new(size_t size)
{
cout<<"my global new() \n"<<endl;
return my_alloc(size);
}
inline
void* operator new[](size_t size)
{
cout<<"my global new[]() \n"<<endl;
return my_alloc(size);
}
inline
void operator delete(void* ptr)
{
cout<<"my global delete() \n"<<endl;
my_free(ptr);
}
inline
void operator delete[](void* ptr)
{
cout<<"my global delete[]() \n"<<endl;
my_free(ptr);
}