malloc free和new delete的使用

来源:互联网 发布:linux下mysql启动不了 编辑:程序博客网 时间:2024/05/19 18:10
1、malloc
 c和c++,都有,申请空间后必须手动释放,但是在申请类的空间的时候,不会自动调用构造函数。

2、new
 c++专有,申请空间后可以自动进行空间回收,而且申请类的空间的时候,可以自动调用构造函数。

3、free(与malloc对应)和delete(与new对应)
通过free释放空间的时候不会自动调用类的析构函数,但是delete会自动调用类的析构函数。

4.只要是内存模型相同,指向已经申请空间的数据的引用类型数据也是可以释放所申请的空间的

测试代码:

#include<iostream>using namespace std;struct Str{     int x;     int y;};int main(){    Str* a=(Str*)malloc(sizeof(Str*)*2);    a->x = 11;    a->y = 22;    a[1].x=33;    a[1].y=44;    Str* test=a;    free(test);    return 0;}

在free(test)之前断点提示,内存分配如下图所示:

在free(test)之后断点提示,内存分配如下图所示:

  
由前后的调试结果可知:

1.同类型的引用类型数据也可以释放其他指针所申请的空间。(其实不同类型的引用类型数据也可以释放其他指针所申请的空间)。如下图所示:

代码区别:void * test=(void *)a;
 


ps1:
当使用malloc申请多个内存地址,比如上面的代码就是2个机构体的内存地址空间,此时当问需要使用数组方式
 
ps2:
野指针的问题,我们通过断点调试发现,当申请的内存空间被释放后,但是指针依然会指向原来所指的位置,这样会给以后造成负面影响,比如拿原来的指针进行了误操作,为了避免此类问题 ,我们需要在空间被释放后,对指针赋NUll值,即:
test=NUll;
malloc申请二维数组

#include <malloc.h>
#include <stdio.h>
int main()
{
    int (*a)[2] = (int(*)[2])malloc(sizeof(int)*3*2);
    a[0][0] =1;
    a[0][1] =2;
    a[1][0] =3;
    a[1][1] = 4;
    a[2][0] =5;
    a[2][1] = 6;
    printf("%d\t%d\t%d\t%d\t%d\t%d\n",a[0][0],a[0][1],a[1][0],a[1][1],a[2][0],a[2][1]); 
    free(a);
    system("pause");
}




或者:
#include <malloc.h>
#include <stdio.h>
int main()
{
    int **a = (int**)malloc(sizeof(int)*3);
    a[0]=(int*) malloc(sizeof(int)*2);
    a[1]= (int*)malloc(sizeof(int)*2);
    a[2]= (int*)malloc(sizeof(int)*2);
    a[0][0] =1;
    a[0][1] =2;
    a[1][0] =3;
    a[1][1] = 4;
    a[2][0] =5;
    a[2][1] = 6;
    printf("%d\t%d\t%d\t%d\t%d\t%d\n",a[0][0],a[0][1],a[1][0],a[1][1],a[2][0],a[2][1]); 
    free(a[0]);
    free(a[1]);
    free(a[2]);
    free(a);
    system("pause");
}
0 0
原创粉丝点击