最近在看老师给的数据结构的代码,有对new与delete的重载,之前c++课没有讲过,所以详细看了一下,谁知竟然打开了新世界的大门QwQ。代码如下
void* operator new(size_t) { // Overloaded new operator
if (freelist == NULL) return ::new Link; // Create space//如果freelist为空,用标准new,创建一个空间
// Can take from freelist//在delete的时候不调用全局的delete,而是将要delete的地址给freelist,下次调用new的时候可以避免向内存申请空间。
//而是直接将freelist的地址给出来。//同时将这些地址传成一个链表构成内存池方便以后取用
Link<E>* temp = freelist;
freelist = freelist->next;
return temp; // Return the link
}
// Overloaded delete operator
void operator delete(void* ptr) {
//将原来的地址放在现在地址的下一个
//将现在的地址归到内存池的头部
((Link<E>*)ptr)->next = freelist; // Put on freelist
freelist = (Link<E>*)ptr;
}
};
其中freelist是该类中的一个静态成员,声明如下
static Link<E>* freelist; // Reference to freelist head//内存池的头
一开始我是这行代码看不懂
if (freelist == NULL) return ::new Link; // Create space//如果freelist为空,用标准new,创建一个空间
百度一下,::new表示调用全局new操作符,说人话的意思就是调用C++给你定义好的标准new运算符。这里的freelist其实是一个我们定义的内存池的第一个内存的地址。如果内存池为空,那么就让向系统要个内存返回地址。
void operator delete(void* ptr) {
//将原来的地址放在现在地址的下一个
//将现在的地址归到内存池的头部
((Link<E>*)ptr)->next = freelist; // Put on freelist
freelist = (Link<E>*)ptr;
}
};
下面就是delete了,我们重载的delete运算符其实并没有释放内存,
而是将内存放入freelist为头的一个链表中,这个链表给出了所以没有本来应该被释放却没有释放的内存的地址。
Link<E>* temp = freelist;
freelist = freelist->next;
return temp;
在下次调用new时,返回其中一个在freelist链表中的内存地址,避免了内存的重复申请释放