malloc free和new delete的使用
2015-04-22 09:35
127 查看
1、malloc
c和c++,都有,申请空间后必须手动释放,但是在申请类的空间的时候,不会自动调用构造函数。
2、new
c++专有,申请空间后可以自动进行空间回收,而且申请类的空间的时候,可以自动调用构造函数。
3、free(与malloc对应)和delete(与new对应)
通过free释放空间的时候不会自动调用类的析构函数,但是delete会自动调用类的析构函数。
4.只要是内存模型相同,指向已经申请空间的数据的引用类型数据也是可以释放所申请的空间的。
测试代码:
在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");
}
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");
}
相关文章推荐
- malloc free和new delete的区别和联系
- C编程中的malloc()和free()函数使用详解
- malloc()和free()的使用
- new delete和malloc free的区别
- 【让你的C++程序更加高效】条款03:尽量使用new/delete而不是malloc/free
- linux 下 C 编程和make的方法 ( 九、malloc 和free的使用 上)
- 7.10 malloc/free 的使用要点
- 使用 malloc后free出错 错误所在
- 条款3,4:尽量用new和delete而不用malloc和free 尽量使用c++风格的注释
- malloc,free使用入门
- malloc/free 的使用要点 以及 new/delete 的使用要点
- new delete和malloc free的区别
- 高质量C++编程之(7.10 malloc/free 的使用要点 7.11 new/delete 的使用要点)
- C++中malloc/free和new/delete 的使用
- C++拾遗--malloc free与new delete的同与不同
- New delete 和 malloc free的区别
- malloc free和new delete的区别和联系
- 使用二级指针分配和释放内存示例 malloc(), free()
- malloc free与new delete的区别和联系
- malloc/free和new/delete的主要区别以及c与c++关于结构体定义使用的区别