免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Dannysd
打印 上一主题 下一主题

[C] 小白求教大型程序里是一般是怎么封装malloc的? [复制链接]

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
21 [报告]
发表于 2014-06-30 15:29 |只看该作者
回复 18# selfrun


    谢谢selfrun回复

    assert检查也行,但我觉得如果要经过这个函数计算的话,还不如 if 判断一下就 abort()

    我更倾向于用 if 判断  

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
22 [报告]
发表于 2014-06-30 15:33 |只看该作者
回复 19# asdf2110


    谢谢asdf2110回复

    “宁可让程序抛 error,也不能 crash”   赞 +1
   
    这个方法的确不错,回头仔细了解一下,谢谢

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
23 [报告]
发表于 2014-07-01 17:27 |只看该作者
一般比较大的程序,看你的分配内存是在配置阶段还是在流程阶段。
如果配置阶段你可以简单封装一下,用于定位是否有内存泄漏(如计数等),每次都调用malloc。
如果是流程阶段,你最好是一次性分配一个比较大的内存,然后根据单元划分,挂到对应链上,自己维护这个链,减少系统调用。

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
24 [报告]
发表于 2014-07-01 23:25 |只看该作者
回复 23# 计算机小强


    谢谢 计算机小强 回复

    明白,大概简述一下:

    初始化的时候可以用malloc这样的,而且次数也比较少,反正初始化只进行一次,用完了要么马上释放,要么直到程序结束

    而在业务流程的时候就适用 内存池 的方式来减少内存碎片,提高内存分配时的效率,使碎片内部化

    应该是这个意思吧  

论坛徽章:
0
25 [报告]
发表于 2014-07-02 13:42 |只看该作者
……这年头也就C那么多破事么。
纠结个啥。只要结果要用到就肯定要检查,否则出问题了查起来就是你的责任跑不掉。别听那些有的没的忽悠你偷懒偷在错误的地方上。
至于是不是封装起来而不自己显式比较结果那跟是不是要检查是两回事。
如果hold不住光一个assert也行,不过小心别被NDEBUG掉否则挂了没法复现自己哭去吧。一般自己实现定制的assert顺便打印错误信息。
靠谱点的就是做log然后再看是不是要挂掉。复杂度自己看着办。
万金油就是像19楼那种抄C++的bad_cast到上层再挂掉,关键是调用方想偷懒忽略检查都没机会错了——本来就不需要自己另外写代码。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
26 [报告]
发表于 2014-07-03 21:30 |只看该作者
本帖最后由 yulihua49 于 2014-07-03 21:36 编辑
Dannysd 发表于 2014-06-29 10:46
RT,

在比较大的工程中,像malloc/free这样的函数应该是封装的吧?

单独封装malloc并没有什么意义。
一般我们是封装一个功能。
原则:
在哪里alloc,就在哪里free。
如果做不到,那么,提供init,并提供free。
先init(构造),然后使用其中的数据,可能是malloc的。最后free(析构)。
例如,tree_init(树),构造空树,tree_add 建立节点 分配了内存,tree_find 检索树 使用了tree_add分配的内存,最后tree_free,释放此树的内存。。。。

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
27 [报告]
发表于 2014-07-04 10:12 |只看该作者
回复 25# 幻の上帝


    谢谢幻の上帝回复

    有道理,到时候不能复现的BUG就太让人头疼了

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
28 [报告]
发表于 2014-07-04 10:19 |只看该作者
回复 26# yulihua49


    谢谢yulihua49回复

    建立树节点来标记分配的内存,等到free的时候应该比链表方便

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
29 [报告]
发表于 2014-07-04 10:29 |只看该作者
问题在于封装了之后能干吗,内存分配不成功,顶多能死的好看点。

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
30 [报告]
发表于 2014-07-04 10:30 |只看该作者
问题在于封装了之后能干吗,内存分配不成功,顶多能死的好看点。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP