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个机构体的内存地址空间,此时当问需要使用数组方式。
野指针的问题,我们通过断点调试发现,当申请的内存空间被释放后,但是指针依然会指向原来所指的位置,这样会给以后造成负面影响,比如拿原来的指针进行了误操作,为了避免此类问题 ,我们需要在空间被释放后,对指针赋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");
}
#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");
}