在realloc失败后自由悬挂对象警告

在realloc失败后自由悬挂对象警告,第1张

概述我正在完成我的安全字符串检索功能,并决定打开我的编译器警告,看看我的代码是否有任何标志. 目前我在Pelles C IDE上收到以下编译器警告: stringhandle.c(39): warning #2800: Potentially dangling object 'str' used after call to function 'realloc'.stringhandle.c(50): 我正在完成我的安全字符串检索功能,并决定打开我的编译器警告,看看我的代码是否有任何标志.

目前我在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可能悬空?
>如何删除警告?
>我正确处理我的tmp指针吗?

解决方法 只是为了说明我的观点:

#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()函数将几乎消失. (检查反汇编输出).

总结

以上是内存溢出为你收集整理的在realloc失败后自由悬挂对象警告全部内容,希望文章能够帮你解决在realloc失败后自由悬挂对象警告所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1226208.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存