C语言动态内存管理
malloc:不初始化的申请动态内存空间(一个参数)
calloc:有初始化的申请动态内存空间(两个参数)
realloc:调整已经申请好的动态空间的大小
free:释放已申请的动态空间
以上都是在堆上开辟空间
void Test()
{
int*p1=(int*)malloc(sizeof(int)*4);
free(p1);
int*p2=(int*)calloc(4,sizeof(int));
int*p3=(int*)realloc(p2,sizeof(int)*6);
free(p3);//不需要free(p2)
}
C++动态内存管理
1.new/delete动态管理对象。
new用法:
一般用法: new 类型 (初值)
1.开辟单变量地址空间 int *a = new int(5) //将整型变量赋值为5
2.开辟数组空间:
一维: int *a = new int[100];开辟一个大小为100的整型数组空间
二维: int **a = new int[5][6] 依此类推.
delete用法:
1.int *a = new int; delete a; //释放单个int的空间
2.int *a = new int[5]; delete [] a; //释放int数组空间 要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问
2.malloc/free和new/delete的区别与联系
1.malloc只开辟空间,new 开辟空间且调用构造函数进行初始化,而free仅回收空间,delete先调用析构函数后回收空间
2.malloc/free是C/C++的库函数,new/delete是C++操作符。
3.malloc/free需要手动计算大小且返回值为void*,new/delete可自动计算类型的大小,返回值为对应的指针类型。
注意!!! malloc/free、 new/delete、 new[]/delete[]
⼀定要匹配使⽤,!否则可能出现内存泄露甚⾄程序崩溃的问题
3.new[]/delete[]动态管理对象数组。
void Test()
{
int*p4=new int();//分配4个字节
int*p5=new int(3);//分配4个字节并初始化为3
int*p6=new int[10];//分配40个字节10个整形空
delete p4;
delete p5;
delete p6[];
}
4.用define宏来实现new[] / delete[]开辟数组:
#define NEWA(P,count, TYPE,) \
{ \
P = (TYPE*)opertor new(sizeof(TYPE)*N + 4);//多开辟4个字节 \
*((int*)P) = N;// 多出来的4个字节是用来存放要开辟的对象个数的; \
size_t i = 0; \
for (; i < N; i++) \
new(P + i)TYPE; // 开辟出来的空间逐块初始化\
}
#define DELETEARRY(P, TYPE)\
{ \
size_t N = 0; \
N = *((TYPE*)((char*)P - 4));// 得先获取到数组元素个数 \
P = (TYPE*)P
\
for (size_t i = 0; i < N; i++)// 数组元素个数决定析构次数\
P[i].~TYPE(); \
P = (TYPE*)((char*)P - 4) \
operator delete P \
}
注意:只有当为类的对象(内置类型)开辟空间,并且该类有自定义的析构函数是,才会有多出的4个字节!
3.C++其他内存管理接口
void* operator new(size_t size);
void operator delete(size_t size);
void* operator new[](size_t size);
void operator delete[](size_t size);
operator new 与 operator delete不是对new delete的重载,而是标准库函数,我们也不能对new delete进行重载