c - 此代码是否会造成内存泄漏以及如何对其进行测试
问题描述
嗨,我有一个源代码 C,如下所示:
#include <stdio.h>
#include <stdlib.h>
void test(int *a,int n)
{
a=(int*)malloc(n * sizeof(int));
for(int i=0;i<n;i++)
a[i] = i+1;
}
int main()
{
int *ptr;
int n;
n = 5;
printf("Enter number of elements: %d\n", n);
test(ptr,n);
if (ptr == NULL) {
printf("Memory not allocated.\n");
}
else {
//...
}
return 0;
}
据我了解,当我们调用函数test时,程序会创建一个pointer
ptr的影子放在test里面,然后当我们退出test时,ptr的影子会被删除所以在main()
ptr中仍然存在NULL
,但是在test里面我们有malloc
一个 ptr 内存,这个内存在heap
我们测试结束时它不是空闲的。所以如果我多次调用测试,这会导致内存泄漏,这是真的吗?我怎样才能用free()
main 函数释放这个内存?
解决方案
据我了解,当我们调用函数 test 时,程序会创建一个指针 ptr 的影子放在 test 中,然后当我们退出 test 时,ptr 的影子将被删除,所以在 main() 中 ptr 仍然为 NULL,但是在测试中,我们有一个用于 ptr 的 malloc 内存,这个内存在堆中,当我们退出测试时它不是空闲的。所以如果我多次调用测试,这会导致内存泄漏,这是真的吗?
你的理解是正确的。调用一次函数就足以导致内存泄漏。
以及如何在 main 中使用 free() 函数释放此内存?
您必须将指针返回给调用者才能启用它。看到这个:
动态内存访问只在函数内部起作用
推荐阅读
- javascript - 为什么我在安装 watermarkJS 后在 NODE JS 上得到 window is not defined 错误
- leaflet - 如何为非地理地图(例如平面图)添加传单绘制?
- wordpress - 使用 Twig/Timber/Wordpress 和 Bootstrap 4 在引导轮播“carousel-item”中的多个项目
- sql-server - 如何连接来自同一个表的列?
- reactjs - 为什么,确切地说,我们需要 React.forwardRef?
- java - 将动态 json 转换为具有动态字符串值的 java 对象。无键值json结构
- java - Spring Boot 慢 XHR 传输率
- node.js - 尝试安装 NodeJS 14 会改为安装 NodeJS 8
- javascript - 在带有 lit-element Web 组件的 html 渲染中插入一个节点
- node.js - 如何更改温斯顿时间戳中的时区?节点js