C++动态内存管理

C语言中,动态内存的管理一般用malloc,calloc,realloc和free这几个函数,他们之间的区别和联系在之前的博客中已经总结过了。C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此C++又提出 了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

malloc/free 

malloc:用来申请类类型对象空间,对自定义类型malloc申请空间期间不会调用构造函数                                                                    free:释放对象空间,但是不会调用析构函数,对于自定义类型来说会造成资源泄露

new/delete

  1. 操作内置类型
void test()
{
     // 动态申请一个int类型的空间
     int* ptr4 = new int;
     // 动态申请一个int类型的空间并初始化为10
     int* ptr5 = new int(10);
     // 动态申请10个int类型的空间
     int* ptr6 = new int[3];
     delete ptr4;
     delete ptr5;
     delete[] ptr6; 
}

   2.  new和delete操作自定义类型

class Test
{
public:   
	Test() : _data(0) 
	{ 
		cout << "Test():" << this << endl;
	}

	~Test() 
	{ 
		cout << "~Test():" << this << endl; 
	} 
private:   
	int _data;
};

void Test2()
{
	// 申请单个Test类型的空间
	Test* p1 = (Test*)malloc(sizeof(Test));
	free(p1);
	// 申请10个Test类型的空间 
	Test* p2 = (Test*)malloc(sizoef(Test) * 10);
	free(p2);
}
void Test2()
 {    
    // 申请单个Test类型的对象 
   Test* p1 = new Test;
   delete p1;
   // 申请10个Test类型的对象
   Test* p2 = new Test[10];
   delete[] p2; 
}

 


 new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的 全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局 函数来释放空间

new T: 第一步申请空间void* operator new(sizeof(T))

/* operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;
  申请空间失败,尝试执行空间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。 */ 
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc) 
{    // try to allocate size bytes
	void *p;
	while ((p = malloc(size)) == 0)
		if (_callnewh(size) == 0)
		{ 
			// report no memory 
			// 如果申请内存失败了,这里会抛出bad_alloc 类型异常 
			static const std::bad_alloc nomem;  
			_RAISE(nomem); 
		}

	return (p);
}

/* operator delete: 该函数最终是通过free来释放空间的 */
void operator delete(void *pUserData)
{
	_CrtMemBlockHeader * pHead;

	RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));

	if (pUserData == NULL) 
		return;
	_mlock(_HEAP_LOCK);  /* block other threads */  
	__TRY

	/* get a pointer to memory block header */ 
	pHead = pHdr(pUserData);

	/* verify block type */   
	_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

	_free_dbg(pUserData, pHead->nBlockUse);

	__FINALLY       
	_munlock(_HEAP_LOCK); /* release other threads */ 
	__END_TRY_FINALLY

	return;
}
/* free的实现 */
 #define   free(p)               _free_dbg(p, _NORMAL_BLOCK)

 第二步:调用构造函数初始化对象

delete T

第一步:调用析构函数,将p所指向对象中的资源清理

第二步:释放空间

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值