C++动态内存管理

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[]开辟数组:

C++动态内存管理_第1张图片

#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);  

C++动态内存管理_第2张图片

operator new 与 operator delete不是对new delete的重载,而是标准库函数,我们也不能对new delete进行重载

你可能感兴趣的:(内存管理,c++,C++)