重载new&delete运算符
重载new&delete运算符
重载new和delete运算符的目是为了自定义内存分配的细节。(内存池:快速分配和归还,无碎片)
在C++中,使用new时,编译器做了两件事情:
1)调用标准库函数operator new()分配内存;
2)调用构造函数初始化内存;
使用delete时,也做了两件事情:
1)调用析构函数;
2)调用标准库函数operator delete()释放内存。
构造函数和析构函数由编译器调用,我们无法控制。
但是,可以重载内存分配函数operator new()和释放函数operator delete()。
1)重载内存分配函数的语法:void* operator new(size_t size);
参数必须是size_t,返回值必须是void*。
2)重载内存释放函数的语法:void operator delete(void* ptr)
参数必须是void *(指向由operator new()分配的内存),返回值必须是void。
重载的new和delete可以是全局函数,也可以是类的成员函数。
为一个类重载new和delete时,尽管不必显式地使用static,但实际上仍在创建static成员函数。
编译器看到使用new创建自定义的类的对象时,它选择成员版本的operator new()而不是全局版本的new()。
void* operator new(size_t size) // 参数必须是size_t(unsigned long long),返回值必须是void*。
{
cout << "调用了全局重载的new:" << size << "字节。\n";
void* ptr = malloc(size); // 申请内存。
cout << "申请到的内存的地址是:" << ptr << endl;
return ptr;
}
void operator delete(void* ptr) // 参数必须是void *,返回值必须是void。
{
cout << "调用了全局重载的delete。\n";
if (ptr == 0) return; // 对空指针delete是安全的。
free(ptr); // 释放内存。
}
本文作者:jinganglang567
本文链接:https://www.cnblogs.com/tgfoven/p/17115573.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步