内部会分配内存的vxworks函数 | vxworks API who allocates memory inside

gaohe8 2013-09-10 01:33:41
必须写到知识库里来方便以后查找,同时供大家参考少走弯路了。
前面参加的一个vxWorks项目,已经处理过realloc的问题,新的项目也同样存在,但由于没有记录和整理,重新犯了1次错,再次调了这个错,这就是不注意知识整理的后果
realloc有时等于free:
void *ptr = malloc(10);
if(ptr!=NULL)
realloc(ptr,0);

有时等于malloc:
void *ptr = realloc(NULL,100);

其他就是它自己。所以用realloc代替free不可靠;
void* ptr = malloc(0);

返回的ptr不是null,实际上vxworks为你分配了当前最小的内存块,用memShow 1可看空闲内存块的情况,可能是32字节,也可能是40字节。
memShow 1

LIST OF FREE BLOCKS:
number size
-------- ----------
1 72
1 80
1 1208
1 8424
1 13584
1 43704
1 65384
1 65440
14 65520
1 253600
1 271008
1 5865920


OPTIONS:
ALLOC_ERROR_EDR_WARN
ALLOC_ERROR_LOG
BLOCK_ERROR_EDR_WARN
BLOCK_ERROR_LOG
BLOCK_ERROR_SUSPEND

SUMMARY:
status bytes blocks avg block max block
-------- -------------- ---------- ---------- ----------
current
free 7505704 25 300228 5865904
alloc 12023096 20513 586 -
internal 824 4 206 -
cumulative
alloc 18902232 75472 250 -
peak
alloc 12912784 - - -
value = 0 = 0x0

realloc可能失败,失败时参数的指针不会被free,如果realloc的返回直接覆盖了这个指针,内存泄漏发生了,正确的处理是让realloc返回到一个临时变量ret,如果ret不是null,再将ret赋给目标指针。失败时的处理,一般是释放原来的指针,这样不用在出错时仍然占用内存资源。
void* reallocRet = realloc(ptr, 1000);
if(reallocRet != NULL)
ptr = reallocRet;
else {
free(ptr);
ptr = NULL;
}

新项目中出现的新问题,前一个项目比较小,出现过的问题比较少,动态分配内存的函数除了malloc, calloc和realloc外,只用了inet_ntoa,这个函数在vxworks5.5中会动态分配内存,返回该地址,在vxworks6.8中已经变为返回静态数组的地址了,所以不会忘记释放造成内存泄漏了。
新项目中发现的内存泄漏,是由于自定义的一个数据结构队列中,为同步添加了信号量成员,但释放时未semDelete它,导致每次处理都使内存减少200多字节。这类问题难以发现,除非有人提供vxworks的所有可能占用内存的API,我在网上搜了一下,没找到,所以在这里发帖,也用于记录一下遇到的这类API。
顺便说一下,这么多论坛,内容大同小异,转帖多,原创少,也就是有价值的少,如果中国人能习惯于合作完成事情,而不是总另起炉灶同质化蜂拥而上,咱们的技术水平一定可以提高的更快!
...全文
426 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
kitten1 2013-09-16
  • 打赏
  • 举报
回复
在tony哪里也转一个吧!那里好像资源挺多
呔妖怪来嘛 2013-09-16
  • 打赏
  • 举报
回复

2,179

社区成员

发帖
与我相关
我的任务
社区描述
xworks是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统。
社区管理员
  • VxWorks开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧