今天我们先对前面的动态内存管理进行一个收尾。
1.operator new和operator delete
1.new是动态申请内存的操作符,它主要要完成两部分工作:
a.申请空间:new的底层是由operator new来申请空间,而operator new是通过malloc来申请空间。
b.调用构造函数(构造函数不开空间,是通过malloc来开空间)。
//operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;
//申请空间失败,尝试 执行空间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常
void* _CRTDECL operator new(size_t size)_ THROE1(_STD bad_alloc)
{
//try to allocate size bytes
void* p;
while ((p = malloc(size)) == 0)
{
if (_callnewh(size) == 0)
{
//如果申请内存失败了,这里会抛出bad_alloc类型的异常
static const std::bad_alloc nomem;
_RAISE(nomem);
}
return (p);
}
}
总结:new的实现,先用malloc申请空间:成功->直接返回;失败->执行用户提供的空间不足的应对措施;(如果用户未提供->抛异常;用户提供了->执行->继续使用malloc申请)。
2.delete是动态释放内存的操作符,它主要完成两部份工作:
a.调用析构函数:释放对象中的资源。
b.释放空间:delete底层是通过operator delete来释放空间,而operator delete是通过free来释放空间。
/* operator delete: 该函数最终是通过free来释放空间的 */ void operator delete(void *pUserData) {
_CrtMemBlockHeader * pHead;
RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
if (pUserData == NULL)
return;
通过上述两个全局函数的实现知道,operator new 实际也是通过malloc来申请空间,如果malloc申请空间 成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异 常。operator delete 最终是通过free来释放空间的。
下面代码演示了,针对链表的节点ListNode通过重载类专属 operator new<