作者:乐土网6868 | 来源:互联网 | 2023-05-19 05:52
必须写到知识库里来方便以后查找,同时供大家参考少走弯路了。前面参加的一个vxWorks项目,已经处理过realloc的问题,新的项目也同样存在,但由于没有记录和整理,重新犯了1次错,再次调了这个
必须写到知识库里来方便以后查找,同时供大家参考少走弯路了。
前面参加的一个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。
顺便说一下,这么多论坛,内容大同小异,转帖多,原创少,也就是有价值的少,如果中国人能习惯于合作完成事情,而不是总另起炉灶同质化蜂拥而上,咱们的技术水平一定可以提高的更快!
2 个解决方案