C语言和C++对于内存管理的区别(开辟内存和释放内存)

C语言:

1.开辟内存:malloc()               使用malloc 缺点 :  (1)、容易导致越界;例如:int *p = (int *)malloc(1); 明显指针大小为4字节,一个字节明显不够                                                              

                                                                                 (2)、  没有(不可以)初始化;

2.释放内存:free()

C++:

1.开辟内存:new + 类型;   例如:int *p = new int;

2.释放内存:delete + 开辟内存的变量名; 例如:delete p;

注意几点问题:    C++数组只可以做'0'初始化:int *a = new int[10]();    //初始化为0;

                             开辟常量类型一定要初始化:const int *a = new const int(10); 

                             重定位new:        int a;

                                                       char *p = new (&a) char('a');    //从a的内存中截取一字节给char 'a'使用,不用释放p的内存;

开辟数组内存:

1.一维数组:

                  C语言:int *a  =  (int *) malloc(sizeof(int)*10);     释放:free(a);

                  C++:     int *a = new int[10];     释放:delete [] a;

2.二维数组:

                 C语言:

int **a = (int**)malloc(sizeof(int*)*10);   //a[10][10]大小
for(int i = 0;i<10;i++)
{
    a[i] = (int *)malloc(sizeof(int)*10)
}
//释放二维数组时,先释放一维数组,再释放二维数组
for(int i=0;i<10;i++)
{
    free(a[i]);//先释放一维指针

}
free(a);//最后释放我二维指针 

                    C++:

int **a = new int*[10];
for(int i = 0;i<10;i++)
{
    a[i] = new int[10];
}
//释放二维数组时,先释放一维数组,再释放二维数组
for(int i=0;i<10;i++)
{
    delete (a[i]);  //先释放一维数组
    a[i] = NULL; //防止野指针
}
delete a;  //再释放二维数组
a =  NULL;

new和malloc的区别:

1.new是从自由存储区域开辟;malloc是从堆上开辟;

2.new的返回值类型安全;mallo返回值类型不安全;

3.new不需要计算内存的开辟大小;malloc需要计算开辟内存的大小;

4.new抛出异常(bad_alloc);malloc返回值为空;

5.new可以初始化;malloc不可以初始化;

猜你喜欢

转载自blog.csdn.net/qq_41038824/article/details/87879042
今日推荐