通过函数给指针申请内存时遇到的内存泄漏问题
来源:互联网 发布:mac windows 10驱动 编辑:程序博客网 时间:2024/05/16 17:55
通过函数给指针申请内存说到底就是一个参数传递的问题,很简单但是也很容易犯错误。
一、例子(一) 使用一级指针作为参数
#include "stdio.h"#include "malloc.h"void mem_malloc(int *p, int num){ p = (int *)malloc(num * sizeof(int)); return;}void main(){ int *pi; mem_malloc(pi, 10);}
细心的读者朋友应该发现,上面代码存在着问题。mem_malloc函数里的这个参数只是pi的一个副本,在mem_malloc函数调用结束后就没了,malloc分配的内存首地址也没带出来,pi还是原来的pi没变。函数调用结束后,由于没有带回首地址,申请的堆内存无法释放,还发生了内存泄漏。
如果要用一级指针实现参数传递,可以按照如下方式修改。
#include "stdio.h"#include "malloc.h"int* mem_malloc(int *p, int num){ p = (int *)malloc(num * sizeof(int)); return p;}void main(){ int *pi; pi = mem_malloc(pi, 10); free(pi); pi = NULL;}
这样看起来是返回了一个局部变量的地址,但这个地址是个堆地址,函数结束后任然有效,使用完之后一定要记得释放,不然会引起内存泄漏。
二、例子(二) 使用二级指针作为参数
如下例子在调用memory_alloc函数后,申请的内存首地址也带回了,使用完之后释放内存。
#include "stdio.h"#include "malloc.h"#include "string.h"void memory_alloc(void **pp, int num){ *pp= (void *)malloc(num * sizeof(int)); return;}void main(){ char *p; memory_alloc((void **)&p, 20); memset(p,0x00,10); sprintf(p,"%s","Hello World!\n"); printf("%s\n",p); free(p); p= NULL; return;}
阅读全文
0 0
- 通过函数给指针申请内存时遇到的内存泄漏问题
- C语言基础之函数、虚拟键盘的使用、数组、指针、动态申请内存、内存泄漏
- C语言基础之函数、虚拟键盘的使用、数组、指针、动态申请内存、内存泄漏
- 关于用函数指针参数申请动态内存的问题
- 关于用函数指针参数申请动态内存的问题
- 对通过函数申请内存的理解
- 如何在函数体内给外部指针申请内存
- 指针动态申请内存的问题
- 在windows内核中申请内存时遇到的问题
- C++语言中用指针申请内存时产生的问题。
- AFNetworking遇到内存泄漏问题
- c++中指针的内存申请和内存释放问题
- c++中指针的内存申请和内存释放问题
- 申请内存的函数
- 申请内存的问题
- 调用strcpy等函数时出现的内存泄漏问题
- [指针四] 通过函数进行动态内存申请---二级指针、函数返回值
- C++函数动态申请指针的内存管理
- [ReactNative]ViewPager不显示图片
- cakes
- ajax response 导出文件
- 机器学习实践-k近邻算法-约会网站配对源码
- can't start git:usr/bin/git
- 通过函数给指针申请内存时遇到的内存泄漏问题
- js的slice,substring,substr,split用法
- 取double类型的几位有效数字
- 关于Toolbar的使用小结
- LeetCode231 Power of Two
- 【Leetcode】【python】First Missing Positive
- java.sql.SQLException: No suitable driver 的详细解决办法
- win8 win10 安装msi 提示2502、2503的错误代码
- 寻找丑数,把只包含因子2、3和5的数称作丑数(Ugly Number)