new/delete 和malloc/free 的区别(代码部分)


理论部分参见

http://www.cppblog.com/Lee/archive/2009/03/09/75990.html

//头文件
#ifndef _NEWDELETE__H_
#define _NEWDELETE__H_
void TestMallocFree();
void TestNewDelete();
void TestNew();
#endif
//源文件
#include <stdio.h>
#include <malloc.h>
class CObject
{
public:
	CObject(){
		printf("Destruct0\n");
	}

	~CObject(){
		printf("ConDestruct0\n");
	}

	void Init(){
		printf("ConDestruct\n");		
	}
	void Destroy(){
		printf("ConDestruct\n");
	}
};

class CMultDestruct
{
public:
	static int c_destruct;
	int m_dat;
	CMultDestruct():m_dat(0)
	{
		c_destruct++;
		printf("没有参数的构造函数,destruct cnt:%d\n",c_destruct);
	}
	CMultDestruct(int a):m_dat(0)//先执行初始化列表,后执行函数体
	{
		c_destruct++;
		m_dat = a;
		printf("带参数的构造函数:m_dat:%d,inpara:%d,destruct cnt:%d\n",m_dat,a,c_destruct);
	}
};
int CMultDestruct::c_destruct = 0;

void TestMallocFree()
{
	CObject* pObject = (CObject*)(malloc(sizeof(CObject)));
  	pObject->Init();
 	pObject->Destroy();
 	free(pObject);
}

void TestNewDelete()
{
	CObject* pObject = new CObject;
	delete pObject;
}

void TestNew()
{
	//无参数的构造
	CMultDestruct* p1= new CMultDestruct();

	//带参数的构造
	CMultDestruct* p2= new CMultDestruct(1);

	//数组的构造和析构
	CMultDestruct* ps1= new CMultDestruct[5];
	delete []ps1;

	//CMultDestruct* ps2= new CMultDestruct[5](1);//错误 编译不过去
	CMultDestruct* ps3[]= {new CMultDestruct(1),new CMultDestruct(2),new CMultDestruct(3),new CMultDestruct(4),new CMultDestruct(5)};
	//delete []ps3;//错误,正确的做法如下
	for(int i=0;i<sizeof(ps3)/sizeof(ps3[0]);i++)
	{
		delete ps3[i];
	}
 
	//依靠操作系统的实例,缺点是只能在函数声明周期结束后才能被回收内存
	CMultDestruct pImp;
	CMultDestruct pImp2 = CMultDestruct(1);

	//静态类的实例
	static CMultDestruct sImp = CMultDestruct(1);
}

执行代码(windows 控制台程序就是放在main()中的)
#pragma region 动态内存申请
	printf("动态内存申请:\n");
	TestMallocFree();
	TestNewDelete();
	printf("测试类的内存申请:\n");
	TestNew();
#pragma endregion /*动态内存申请*/


结果:

 



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值