1718|23

7815

帖子

55

TA的资源

裸片初长成(中级)

楼主
 

分享一个刚经历的脑残问题:free啊free,怎么还free出问题来呢 [复制链接]

 
本帖最后由 辛昕 于 2023-12-8 01:32 编辑

啊,对了,最近在努力,其实是我第一次正儿八经学算法啥的。还是这本老书。

这书的PDF我以前上传过,就不上传了。

虽然我自己买了实体书,比较方便做笔记嘛~~

 

我知道,你们肯定有,网上很多,但课本的源码和答案你们可能没有,我传一份~~

 

挺好用的,因为我觉得 M.A.K似乎不像一个我们以为的那种高校老师,我觉得他的代码定义地非常好,很好很好。

而且我觉得他是一个有故事的码农,而不只是一个老师~~~

 

最后,再传一张gif动图~~我最近真的很沉迷自己制作动图~~

额~~比较难发,算了,我在后面追贴吧~~

 

 

malloc和free这种东西,稀疏平常,平常到不值一提。

下面先扯一个关于malloc在单片机上用的测试结果。

虽然我这次是在PC上写这个程序,其实和单片机没几毛钱关系,但是.............请原谅我是一个很多年没发帖子的水军~~~

以前就说,在单片机上,因为经常有人说,慎用,慎用!

一问却是为何?

答曰:单片机上,尤其是裸机,gc机制一般,又不像windows/linux上,有足够好的gc机制,所以,能不用就不用。

省的搞出事情来。

 

于是再问:能搞出啥事情?

答曰:就算不出现碎片太严重,搞到明明有足够的已释放空间,却就是无法分配一片大一点的空间。

再曰:就算分的出来,时间却无法保证,这,也不是太好的事情.......

 

几个月前(那时候,幸好我还没离职,不然以我后来这破心情,我肯定就不会做这个测试.........),

我忽然想起这件事情,心想:亏我相信了这话十几年,还枉称——什么都要测试,就是C标准库也要测试

 

于是我随手在淘宝上买了一块STM32G030最小系统。(不要问我为什么这种东西还要买,都怪我前阵子一时冲动,大半夜把我的所有开发板扔在我楼下的水渠里(老实讲,这事其实我已经想了十来年,犹豫了十几年),这种行为除了有可能被控诉污染环境,还属于一时冲动.......不过我想,我总算把一些东西留在了佛山平洲......哈哈,虽然我觉得这种事如果以后被人知道了,搞不好会有人抓我去弹鸡鸡.......)

总之,到手后,我写了个程序做测试。

 

我测试的方法很简单。

那个代码我一时半会没找到,不知道放哪去了,你们不用介意,因为真的很容易写。

如果你们真的要,我明天找找.......

 

1、首先我随意写了一组大小不等的数,作为我要轮流malloc和free的大小;

2、因为我轮流malloc和free,所以,总量上,必然可以保证,当前堆上分配的内存,永远都是足够的。

3、不是说担心时间吗?所以我对这个行为进行计时,但这玩意肯定很慢呗,于是我选择了重复几千次还是几万次来着......whatever不重要

4、然后我每执行完这个重复次数就打印一条串口信息——这样,只要我通过串口信息的时间戳,我就可以大致判断,前前后后每一个几千几万次malloc/free

     所执行的时间变化多少。

 

我把这个简单的程序持续运行了72小时。

72小时热机测试,据称是我们行内的办公室测试标准。

 

最后我大致检查了一下留下的一大坨数据。

证明了一件事情:

第一、malloc free从来没有失败;

第二、时间变化几乎不大。

 

所以,从此,老子会开开心心,安安全全的用 malloc free

 

当然,我必须先声明。

我当时是用 IAR for ARM 写的程序,用的是 C标准库 原生的 malloc free

当然这个C标准库,准确来说,自然是 IAR 所内置的 Embedded C标准库。

 

如果以后有时间有兴趣,我会在 Keil5 上也这么来上一拨......

 

你们如果有兴趣,有心情,欢迎在你们的 MCU上 你们的 toolchain  IDE 也玩玩这个

然后汇报一下,谢谢~~~

 

此帖出自编程基础论坛

最新回复

变高可能不太好变,变冷还是有可能的。   详情 回复 发表于 2023-12-20 19:27
点赞 关注(1)
个人签名

强者为尊,弱者,死无葬身之地

 

回复
举报

7815

帖子

55

TA的资源

裸片初长成(中级)

沙发
 

好吧,现在开始说正事。

 

这个是在PC上写的,因为我已经习惯了用 VISUAL STUDIO和 mingw(64) 写代码。

所以这次,和单片机一毛钱也没关系。

 

它其实就是一个很简单的链表程序。

 

我先贴出代码。

你们看看,当然我要先声明,因为,我是要验证东西,所以代码写的可能有那么一丢丢.....额,啰嗦。

你们千万不要以为这是小学鸡写的代码。

因为我十几年前都不会怎么写代码。

你们如果见过我以前的帖子,你们是相信我的~~~

 

我可以先告诉你们这个代码最忧伤的地方就是,你就是见不到 Hi~~

 

  • void test_linklist_ARRAY(void)
  • {
  • p_node A;
  • A = (p_node)malloc(sizeof(struct t_node) * 3);
  • if(NULL == A)
  • printf("A malloc failed.\n");
  • A[0].next = &(A[1]);
  • A[1].next = &(A[2]);
  • A[2].next = &(A[0]);
  • for(int i;i < 3;i++)
  • printf("A[%d] @ %p,next point to %p\n",i,&(A[i]),A[i].next);
  • // 现在要干掉A[1],实现 A[0]->A[2]--
  • // |<--------|
  • p_node X;
  • X = &(A[1]);
  • A[0].next = A[1].next;
  • printf("BYPASS A[1]\n");
  • for(int i;i < 3;i++)
  • printf("A[%d] @ %p,next point to %p\n",i,&(A[i]),A[i].next);
  • printf("GOING TO FREE X @ %p\n",X);
  • free(X);
  • printf("hi~\n");
  • }

 

此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

55

TA的资源

裸片初长成(中级)

板凳
 

我现在当然知道为什么,不过我先卖个关子。

当然,你们可能很牛逼,所以一下就看出来了,但是我先假设你们和我一样,一开始傻逼了。

老实说,但我后来知道原因以后,我有一种

当年在大学宿舍 正儿八经 百度 while 和 if有什么区别的 境界~~~

 

百度 while 和 if 的区别,这种境界,老实说,真的不容易犯。

 

由于我是用 mingw64+makefile,老实讲,我至今不会用 GDB,所以,我并不知道到底出了什么毛病。

最后,我先是在我的 Ubuntu Server上测试了一下这个代码。

我原以为我应该会看到什么  Segment fault

然而,我看到的是一个我以前没见过的东西,老实说,不懂。

百度了,他娘的也没几个正经的解释,佁然不懂。

 

此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

55

TA的资源

裸片初长成(中级)

4
 

后来我甚至为了这个事情折腾了半天,但依然没搞懂,包括codeblocks上

却一样看不懂,算了~~我觉得,我还是继续研究这个问题本身好了。

image.png (2.72 MB, 下载次数: )

image.png
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

55

TA的资源

裸片初长成(中级)

5
 

于是,我重新写了一个程序。

我打算用不一样的方式去写。来验证

结果,下面的这个代码是对的。

 

  • void test_linklist_ABC(void)
  • {
  • p_node A,B,C;
  • A = (p_node)malloc(sizeof(struct t_node));
  • if(NULL == A)
  • printf("A malloc failed.\n");
  • B = (p_node)malloc(sizeof(struct t_node));
  • if(NULL == B)
  • printf("B malloc failed.\n");
  • C = (p_node)malloc(sizeof(struct t_node));
  • if(NULL == C)
  • printf("C malloc failed.\n");
  • A->next = B;
  • B->next = C;
  • C->next = A;
  • printf("Node A @ %p,A->next @ %p\n",A,A->next);
  • printf("Node B @ %p,B->next @ %p\n",B,B->next);
  • printf("Node C @ %p,C->next @ %p\n",C,C->next);
  • // 现在要干掉B,实现 A->C--
  • // |<----|
  • p_node X;
  • X = B;
  • A->next = B->next;
  • free(X);
  • printf("hi~\n");
  • }

 

此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

55

TA的资源

裸片初长成(中级)

6
 

其实我认为,看到这两个函数的对比,可能你们已经就想明白了。

而且后来,我突然觉得.......

我就不要再半夜百度什么 

malloc 和 free 有什么对应关系这种狗屁问题了

或者 free 释放掉的是多大的空间 这种狗屁问题了。

 

也不需要去看什么 malloc 和 free 的实现代码了。

 

因为,这一次,我的脑子稍微好使了一点点,我突然想到。

 

我脑子又被驴踢了,怎么能问出这种问题。

因为,,,,,,你们须知道,我昨晚为这破事琢磨了大半个晚上。

 

今天先跑去做了别的事情,然后再回来蛋疼这个事情.........

 

两个晚上,一个脑残问题。

此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

55

TA的资源

裸片初长成(中级)

7
 

请原谅我最近沉迷自制gif~~~

 

此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

55

TA的资源

裸片初长成(中级)

8
 

算了,先上答案和源码

数据结构与算法分析—c语言描述_课后答案.pdf (247.23 KB, 下载次数: 3)
DSAAC2eCode.tar (193 KB, 下载次数: 1)

靠~~原来只是不让我上图~~不要这样子嘛~~

此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

55

TA的资源

裸片初长成(中级)

9
 

末了,我突然想啰嗦几句。

其实我觉得你们不能怪我......我总觉得这种上境界的脑残问题,好像,过几年就要犯一次,到底咋回事,我也不知道。

此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7482

帖子

2

TA的资源

版主

10
 

51单片机感觉 malloc 和 free 就会有问题。

此帖出自编程基础论坛

点评

可以跑个3天3夜看看,我现在手头没有这个玩意  详情 回复 发表于 2023-12-8 11:01
 
 
 

回复

2万

帖子

71

TA的资源

管理员

11
 

解决了就好,下次要扔板子就扔到坛子里来 哈哈

此帖出自编程基础论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

好熟悉的话,好像我以前听过..........  详情 回复 发表于 2023-12-8 11:01
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

7815

帖子

55

TA的资源

裸片初长成(中级)

12
 
soso 发表于 2023-12-8 10:06 解决了就好,下次要扔板子就扔到坛子里来 哈哈

好熟悉的话,好像我以前听过..........

此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

55

TA的资源

裸片初长成(中级)

13
 
wangerxian 发表于 2023-12-8 09:12 51单片机感觉 malloc 和 free 就会有问题。

可以跑个3天3夜看看,我现在手头没有这个玩意

此帖出自编程基础论坛

点评

哈哈,有机会试试~  详情 回复 发表于 2023-12-8 11:54
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7482

帖子

2

TA的资源

版主

14
 
辛昕 发表于 2023-12-8 11:01 可以跑个3天3夜看看,我现在手头没有这个玩意

哈哈,有机会试试~

此帖出自编程基础论坛
 
 
 

回复

7815

帖子

55

TA的资源

裸片初长成(中级)

15
 

不行,我一定要发出这个自制gif......

此帖出自编程基础论坛

点评

你做gif 啥做的?ps吗?  详情 回复 发表于 2023-12-9 08:31
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

4996

帖子

12

TA的资源

版主

16
 
不行,我一定要发出这个自制gif......



你做gif 啥做的?ps吗?
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

55

TA的资源

裸片初长成(中级)

17
 
吾妻思萌 发表于 2023-12-9 08:31 你做gif 啥做的?ps吗?

不是......公众号玩多了,插图~~

此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

154

帖子

0

TA的资源

一粒金砂(高级)

18
 

解决了就好,下次要扔板子就扔到坛子里来 哈哈

此帖出自编程基础论坛

点评

难道我们之间自有板子聊吗?我们就没有别的可以聊5毛钱天吗? 我太伤心了  详情 回复 发表于 2023-12-13 19:14
 
 
 

回复

7815

帖子

55

TA的资源

裸片初长成(中级)

19
 
花鼓舞 发表于 2023-12-12 21:04 解决了就好,下次要扔板子就扔到坛子里来 哈哈

难道我们之间自有板子聊吗?我们就没有别的可以聊5毛钱天吗?

我太伤心了

此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7753

帖子

18

TA的资源

五彩晶圆(高级)

20
 

可以,爬坑

此帖出自编程基础论坛

点评

卧槽,free叔,你居然粗线了  详情 回复 发表于 2023-12-14 12:55
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
立即报名 | 2025 瑞萨电子工业以太网技术日即将开启!
3月-4月 深圳、广州、北京、苏州、西安、上海 走进全国6城
2025瑞萨电子工业以太网技术巡回沙龙聚焦工业4.0核心需求,为工程师与企业决策者提供实时通信技术最佳解决方案。
预报从速,好礼等您拿~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表