new和delete的重载
new和delete的作用
class Tmp
{
public:
Tmp()
{
cout << "Tmp " << this << endl;
}
~Tmp()
{
cout << "~Tmp " << this <<endl;
}
void* operator new(size_t size)
{
cout << "void* operator new(size_t size)" << endl;
void* p = malloc(size);
return p;
}
void operator delete(void *p)
{
cout << "void operator delete(void *p)" << endl;
free(p);
}
};
int main()
{
Tmp* p = new Tmp();
delete p;
return 0;
}
new和delete的重载的作用
new申请的是堆上内存,而堆上内存对于用户来说是外部资源,申请或释放外部资源用户态没有权限,只有内核态有权限。
因此堆上是内存需要申请或释放就需要内核态进行完成,也就需要从用户态切换到内核态,该过程就是系统调用(操作外部资源都属于系统调用,如操作屏幕,键盘…)
由于操作堆上的内存需要大量的进行系统调用,因此就会应运而生
内存池,内存池是用户态自己维护的一大堆内存,相当于用户一次性从堆上申请很大一段内存,然后由用户自己进行维护,即使使用完了也不会还给堆上,依旧由用户态进行维护。因此用户每一次申请堆上的空间时就不用从堆上进行申请,就可以从内存池中进行申请,不用产生复杂的系统调用。
由于有内存池,就需要对new 和 delete 进行重载,保证用户每一次申请空间就从内存池进行申请或释放,重载 new 和 delete 就可以指定每一次申请或释放空间是从内存池的哪里进行申请或释放的