C++动态内存管理

1.C语言中malloc,calloc,realloc的不同

malloc/calloc/realloc用来在堆上开辟空间。

(1)malloc

void *malloc(size_t size);

malloc()在内存的动态存储区中分配一块长度为size字节的连续区域

(2)calloc

void *calloc(size_t nmemb,size_t size);

calloc()与malloc()相似,参数size为申请地址的单位元素长度,nemb为参数个数

(3)realloc

void *realloc(void *ptr,size_t size);

realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,size是重新申请的地址空间的大小

它们三者的区别:

malloc不能初始化所分配的内存空间,需要用memset;

calloc会将所分配的空间中的每一位都初始化为0;

realloc 可以改变原有内存空间大小,原有内存的内容保持不变;若不能改变,将会开辟一段新的内存,但不会对新开辟的空间进行初始化

2.总结并剖析malloc/free和new/delete之间关系和差异。

 C++通过new和delete动态管理内存

new/delete动态管理对象

new[ ]/delete[ ]动态管理对象数组


malloc/free和new/delete之间的区别和联系

1)它们都是动态管理内存的入口。

2)malloc/free是C/C++标准库函数,而new/delete是C++操作符。

3)malloc/free只是动态分配内存空间/释放空间,而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理。

4)malloc/free需要手动计算类型大小且返回值会void*,new/delete可自己计算类型的大小,返回对应类型的指针。

3.剖析new/delete、new[]/delete[]到底做了些什么事情。

 new做了两件事

1)调用operator new分配空间;

2)调用构造函数初始化对象。

 delete也做了两件事

1)调用析构函数清理对象;

2)调用operator delete释放空间。

new[ ]

1)调用operator new分配空间;

2)调用N次构造函数分别初始化每个对象。

delete[ ]

1)调用N次析构函数清理对象;

2)调用operator delete释放空间。


4.实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。

//模拟new[]/delete[]

#define NEW_ARRAY(PTR,TYPE,N)           \
	do                                  \
	{                                   \
	PTR = (TYPE*)operator new(sizeof(TYPE)*N+4); \
	(*(int*)PTR) = N;                   \
	PTR = (TYPE*)((char*)PTR + 4);      \
for (size_t i = 0; i < N; i++)         \
	{                                   \
      new(PTR + i)TYPE;                 \
     }                                  \
}while (false);


#define DELETE_ARRAY(PTR,TYPE)           \
	do                                   \
	{                                    \
	int N = *((int*)PTR - 1);            \
for (int i = 0; i < N; i++)              \
	{                                    \
	   PTR[i].~TYPE();                   \
}	                                     \
	PTR = (TYPE*)((char*)PTR - 4);       \
	operator delete(PTR);                \
}while (false);

class AA{
private :
	size_t i;
public:	
	AA(size_t i = 10)
	{
		cout << "AA()" << endl;
	}
	~AA()
	{
		cout << "~AA()" << endl;
	}		
};
int main()
{
	AA* P2;
	NEW_ARRAY(P2, AA,10);
	DELETE_ARRAY(P2, AA);
	system("pause");
	return 0;
}
运行结果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值