C/C++动态内存管理

目录:
1:总结并剖析malloc/free和new/delete之间关系和差异。
2:剖析new/delete、new[]/delete[]到底做了些什么事情。
3:实现NEW_ARRAY/DELETE_ARRAY宏,模拟new[]/delete[]申请和释放数组。
  • C语言用malloc/calloc/realloc/free进行内存管理
void Test()
{
	int *p1 = (int*)malloc(sizeof(int)*4);
	int *p2 = (int*)calloc(4,sizeof(int));//分配的内存大小为:int的大小(4)与个数(4)的乘积:16
	int *p3 = (int*)realloc(p2,sizeof(int)*6);
	free(p1);
	//free(p2);这里不需要free(p2),因为p2给了realloc
	free(p3);
}
C++动态内存管理 通过new和delete动态内存管理)
new/delete 动态管理 对象
new[]/delete[] 动态管理 对象数组
void test1()
{
	int* p1 = new int;//动态分配4个字节(1个int)的空间的单个数据
	int* p2 = new int(4);//动态分配4个字节(1个int)的空间并初始化为3
	int* p3 = new int[4];//动态分配12个字节(3个int)的空间

	delete p1;
	delete p2;
	delete[] p3;
}


1:总结并剖析malloc/free和new/delete之间关系和差异。
1> 它们 都是动态管理内存的入口
2> maloc/free 是C/C++标准库的函数
new/delete 是C++操作符
3> malloc/free 只是动态分配内存空间/释放空间
new/delete 除了分配空间(还会调用构造函数和析构函数进行初始化和清理(清理 成员))
4> malloc/free 需要手动计算类型大小 返回值会void*(所以每次用的时候会强转类 型)
new/delete 可以自己计算类型的大小 返回对应类型的指针
5> malloc 失败了 返回0
new 失败了 会抛出异常
2:剖析new/delete、new[]/delete[]到底做了些什么事情。
new:
1.调用了operator new 分配空间
2.调用了构造函数初始化列表
delete:
1.调用析构函数清理对象
2.调用operator delete释放空间
new[N]:
1.调用了operator new 分配空间
2.调用N次构造函数分别初始化每个对象
delete[]:
1.调用了N次析构函数清理对象
2.调用了operator delete释放空间
3:实现NEW_ARRAY/DELETE_ARRAY宏,模拟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(0);
#define DELETE_ARRAY(ptr,type)								\
	do{														\
	size_t n;												\
	n = *((int*)ptr-1);										\
	for(size_t i = 0;i < n;++i)								\
	(ptr+i)->~AA();											\
	operator delete((char*)ptr-4);							\
}while(0);
class AA
{
public:
	AA()
	{
		cout<<"AA()"<<endl;
	}
	~AA()
	{
		cout<<"~AA()"<<endl;
	}
};
void test2()
{
	AA* p1 = NULL;
	NEW_ARRAY(p1,AA,10);
	DELETE_ARRAY(p1,AA);
}



猜你喜欢

转载自blog.csdn.net/qq_37941471/article/details/78440137