D
G
O
L

重载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);      // 释放内存。
}

posted @ 2023-02-13 10:44  jinganglang567  阅读(294)  评论(0)    收藏  举报