重载new和delete
起源
如果我们的程序需要频繁的new和delete,就会导致内存碎片、性能损失等问题,所以需重载new 和delete,如果我们不用new和delete,直接把数据放在栈里面,是不是就能避免这个问题呢,但栈的空间是有限的,大型程序都是把数据放在了堆里面
原理
new的工作原理
1.通过new分配内存
2.调用构造函数
3.返回内存的指针
delete工作原理
1.调用析构函数
2.通过delete释放内存
在这5个步骤里面,我们能够重载的只有new的1和delete的2,其他的都是系统已经写好的
new和delete的其他形式
char* mem=new char[0x10001];
char* x=new(mem) char[10];
new的另一种形式就是指定它所创建的地址,这里x和mem指向同一块内存,就是把第二行的new开辟的内存,然后让mem指向它,即0x10001有了10个char类型的内存空间,然后让x来接收
同样,delete也可以写成这种形式
重载
可以重载为成员函数和全局,但是全局太复杂,而且很容易出错,这里不写
void* hint::operator new(size_t size)
{
return ::operator new(size);
}
为什么返回值是void*呢,因为new一个对象后,都会返回一个指针,函数里面的::operator new 是什么意思呢?这是调用了系统本身的operator new,::表示全局,我们使用一下new
hint* gold1 = new hint;
在这里,我们并没有传入参数size,它是自动把new的对象大小传入进来
void hint::operator delete(void* ptr)
{
std::cout << ptr << "已销毁" << std::endl;
::operator delete(ptr);
}
注意
我们重载new和delete就要把它们的所有(6种)形式全部重载一遍,因为我们重载就是为了更好的管理内存,所以每种new的形式都要重载,如果我们不想重载这么多,可以强制性的用
函数=delete删除掉不用的形式
知识扩展*:重载后的new和delete默认为static函数,这是因为重载new时,还未调用构造函数,没有对象,也就没有this指针,static是没有this指针的,而delete重载是在调用析构之后,很多内存都被释放了