动态内存管理向相关面试题

本文讨论了C++中的动态内存管理,包括operator new和operator delete的职责,以及如何利用它们进行内存分配和释放。同时,文章列举了一些常见的面试问题,如判断变量内存分布、实现链表节点的内存池优化、设计只能在堆或栈上创建的对象等,旨在帮助读者深入理解C++的内存管理机制和面试策略。
摘要由CSDN通过智能技术生成

今天我们先对前面的动态内存管理进行一个收尾。

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<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值