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个机构体的内存地址空间,此时当问需要使用数组方式。
野指针的问题,我们通过断点调试发现,当申请的内存空间被释放后,但是指针依然会指向原来所指的位置,这样会给以后造成负面影响,比如拿原来的指针进行了误操作,为了避免此类问题 ,我们需要在空间被释放后,对指针赋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");
}
0 0
- malloc free和new delete的使用
- new/delete和malloc/free的使用场合和区别
- C++中malloc/free和new/delete 的使用
- malloc/free 和 new/delete的区别
- malloc/free和new/delete的区别
- malloc/free 和 new /delete 的区别
- malloc/free和new/delete的区别
- malloc/free和new/delete的区别
- malloc/free 和 new /delete 的区别
- new/delete和malloc/free的区别
- new/delete和malloc/free的区别
- malloc/free 和 new /delete 的区别
- new/delete和malloc/free的区别
- new/delete 和malloc/free 的区别
- new/delete和malloc/free的区别
- new/delete 和 malloc/free 的区别
- new delete和 free malloc 的区别
- malloc/free和new/delete的区别
- Java日期类型与String的转换
- Source Insight中集成Uncrustify格式化代码
- cf. Tavas and Nafas
- windows下的一个C++ socket服务器
- 将pdf转换成可编辑的ppt转换器
- malloc free和new delete的使用
- HTTPS原理简介
- easyui datagrid组件 单击行 让他不选中 只有单击checkbox的时候才选中
- Android _实现SSL解决不受信任的证书问题
- Maven中手动添加第三方类库到自己电脑的本地仓库.m2
- 这样学英语三个月超过你过去学三年
- 市场信息整合:关于智能家居的市场情况
- jqgrid增、删、改之后将多条数据一次性提交到后台
- UIView的layoutSubviews和drawRect方法何时调用