在realloc失败后自由悬挂对象警告
发布时间:2020-12-16 07:01:13 所属栏目:百科 来源:网络整理
导读:我正在完成我的安全字符串检索功能,并决定打开我的编译器警告,看看我的代码是否有任何标志. 目前我在Pelles C IDE上收到以下编译器警告: stringhandle.c(39): warning #2800: Potentially dangling object 'str' used after call to function 'realloc'.str
|
我正在完成我的安全字符串检索功能,并决定打开我的编译器警告,看看我的代码是否有任何标志.
目前我在Pelles C IDE上收到以下编译器警告: stringhandle.c(39): warning #2800: Potentially dangling object 'str' used after call to function 'realloc'. stringhandle.c(50): warning #2800: Potentially dangling object 'str' used after call to function 'realloc'. 这是我的功能(如果您希望在阅读代码之前完整阅读其中的问题,请阅读以下内容): char *getstr(void)
{
char *str,*tmp;
int bff = STRBFF,ch = -1,pt = 0;
if(!(str = malloc(bff)))
{
printf("nError! Memory allocation failed!");
return 0x00;
}
while(ch)
{
ch = getc(stdin);
if (ch == EOF || ch == 'n' || ch == 'r') ch = 0;
if (bff <= pt)
{
bff += STRBFF;
if(!(tmp = realloc(str,bff)))
{
free(str); //line 39 triggers first warning
str = 0x00;
printf("nError! Memory allocation failed!");
return 0x00;
}
str = tmp;
}
str[pt++] = (char)ch;
}
str[pt] = 0x00;
if(!(tmp = realloc(str,pt)))
{
free(str); //line 50 triggers second warning
str = 0x00;
printf("nError! Memory allocation failed!");
return 0x00;
}
str = tmp;
return str;
}
我想明白为什么我被警告说str可能会悬空.如果发生错误,我释放str指向的分配空间,但是我的函数在被释放后没有进一步调用str.作为一个修复,我只是尝试自由(str),然后str = 0x00.不应该让指针str不再晃来晃去吗?它与我的tmp指针有关吗?我也没有释放或将tmp设置为0x00,因为如果realloc失败,它应该已经是0x00.但是我应该在成功时将其设置为0x00,因为它在技术上仍然准确指向str并且不再需要它? 简而言之: >为什么我的编译器警告str可能悬空? 解决方法
只是为了说明我的观点:
#include <stdio.h>
#include <stdlib.h>
static inline void * myrealloc(void *org,size_t newsize)
{
char * new;
new = realloc(org,newsize);
if (!new) {
fprintf(stderr,"nError! Memory allocation failed!n");
free (org);
return NULL;
}
return new;
}
char *getstr(void)
{
#define STRBFF 256
char *str = NULL;
size_t size,used ;
for (size=used=0; ; ) {
int ch;
if (used >=size) {
str = myrealloc(str,size += STRBFF);
if(!str) return NULL;
}
ch = getc(stdin);
if (ch == EOF || ch == 'n' || ch == 'r') ch = 0;
str[used++] = ch;
if (!ch) break;
}
str = myrealloc(str,used);
return str;
}
现在,如果您的编译器支持内联,对myrealloc()的调用将被原始代码的等效替换,实际的myrealloc()函数将几乎消失. (检查反汇编输出). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
