OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3382|回复: 8

STM32F4使用free函数后,内存没有真正收回,还保留着

[复制链接]

5

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-8-16
在线时间
34 小时
发表于 2020-5-23 08:42:27 | 显示全部楼层 |阅读模式
50金钱
本帖最后由 ghostfly 于 2020-5-23 10:35 编辑

从以下程序可以看出:

1-用free释放一片内存之后,操作系统可能不会真正的收回,当你下一次用malloc分配内存的时候如果大小刚好,它会把你刚释放掉的内存分配给你。如何避免这问题?
Filter函数内as,bs,az,bz在程序第二次循环以后,它们的内存地址却是占用REFilter函数内变量REas,REbs,REaz,REbz的内存地址

程序目的:想对inputhead和inputrod这两个数据分别使用Filter和REfilter函数滤波,两者互不干扰

问题根源(在找解决方式):
这个两个指针的地址每次都一样,导致值互相使用,*Memory_Buffer  和 *REMemory_Buffer。
IIR滤波算法需要依赖上次的中间结果,这两个指针分别用于保存对inputhead和inputrod数据滤波的中间结果,而现在他们地址一样,导致指针指向的内容互相利用,没有独立开来

Filter函数中定义指针
float *Memory_Buffer = (float *)malloc(sizeof(float) * (Norder+1));
REfilter函数中定义指针
float *REMemory_Buffer = (float *)malloc(sizeof(float) * (RE_N+1));
因为需要保存上次执行中间结果,所以不能使用memset函数对这两个指针清零


2-程序简化如下:
#define N 2
#define Cutoff  (float)2
...
while(1)
{
...
inputhead = ...  //inputhead值 在while循环内每次更新,每次不一样
inputrod =  ...  //inputrod值 在while循环内每次更新,每次不一样
...
    Filter(N, Cutoff, inputhead);      
    REfilter(N, Cutoff, inputrod);
}






free失效

free失效

REfliter函数

REfliter函数

Filter函数

Filter函数
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-8-16
在线时间
34 小时
 楼主| 发表于 2020-5-23 08:44:02 | 显示全部楼层

网上解释:这个跟C函数库的实现机制有关。free释放的内存并不会立刻、完全交回给系统。通常的实现是,malloc并不是每次都找内核要(因为找内核要比较慢),实际上是一次要一堆,然后再按需分配给你,因此每次free并不一定能保证把那次向内核申请的内存都不需要了。此外,即便是free了,很有可能程序很快还要申请,保留也是为了提高效率。
可是我需要它每次都重新分配内存不一样,至少保证这样两个函数内变量地址不一样,如何解决
回复

使用道具 举报

0

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2020-5-2
在线时间
0 小时
发表于 2020-5-23 08:48:07 | 显示全部楼层
帮顶!!!!!!
回复

使用道具 举报

5

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-8-16
在线时间
34 小时
 楼主| 发表于 2020-5-23 09:16:23 | 显示全部楼层
cjt999 发表于 2020-5-23 08:48
帮顶!!!!!!

谢谢!因为需要对inputhead和inputrod这两个数据分别使用Filter和REfilter函数滤波,两者互不干扰
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2020-5-23 16:54:47 | 显示全部楼层
单独inputhead和inputrod一个一个正常不
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

5

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-8-16
在线时间
34 小时
 楼主| 发表于 2020-5-23 20:14:37 | 显示全部楼层
解决了:全局指针,初始为空时申请一次,中间不再释放
回复

使用道具 举报

5

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-8-16
在线时间
34 小时
 楼主| 发表于 2020-5-23 20:15:09 | 显示全部楼层
使用全局指针,初始为空时申请一次,中间不再释放。
回复

使用道具 举报

2

主题

1442

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2224
金钱
2224
注册时间
2010-12-16
在线时间
194 小时
发表于 2020-5-23 20:50:16 | 显示全部楼层
如果你的程序依赖内存初值 , 那么你的程序的健壮性是非常有问题的 .
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-5-24 01:25:47 | 显示全部楼层
貌似你在阿莫论坛提问解决了这个问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-1 19:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表