【问题标题】:Freeing pointers in a dynamic array释放动态数组中的指针
【发布时间】:2011-08-26 07:48:13
【问题描述】:

继我之前的一个问题之后:

Copying a string from a pointer to a string

我现在正在尝试将复制的字符串添加到一个动态数组中,该数组的大小将根据 SD 卡上的文件数量逐渐增加,并且将在换出/换入卡后 重新创建某种方式。

此代码第一次运行良好。 SD卡内容改变后,调用reReadSD()函数,释放fileList。读取 SD 卡的新内容并将新值写入 fileList,但是,在从 fileList 打印出名称时,我得到的是符号而不是正确的名称。我认为这是释放 fileList 并重新初始化它的错误,因为相同的代码块在系统启动时工作(当第一次调用 reReadSD 时)但不是第二次调用它。任何人都可以对此有所了解吗?

void reReadSD()
{
    free(fileList);
    files_allocated=0;
    num_files=0;
    reRead_flag=0;


    if(f_mount(0, &fatfs ) != FR_OK ){
        /* efs initialisation fails*/
    }//end f_mount 

    FRESULT result;
    char *path = '/'; //look in root of sd card
    result = f_opendir(&directory, path);   //open directory
    if(result==FR_OK){
        for(;;){
            result = f_readdir(&directory, &fileInfo); //read directory
            if(result==FR_OK){
                if(fileInfo.fname[0]==0){break;} //end of dir reached escape for(;;)
                if(fileInfo.fname[0]=='.'){continue;} //ignore '.' files
                TCHAR* temp;
                temp = malloc(strlen(fileInfo.fname)+1);
                strcpy(temp, fileInfo.fname);
                AddToArray(temp);
            }//end read_dir result==fr_ok
        }//end for(;;)
    }//end open_dir result==fr_ok
}//end reReadSD

和..

void AddToArray (TCHAR* item)
{
    u32 delay; 
    if(num_files == files_allocated)
    {

        if (files_allocated==0)
                files_allocated=5; //initial allocation
        else
                files_allocated+=5; //more space needed 

        //reallocate with temp variable
        void *_tmp = realloc(fileList, (files_allocated * sizeof(TCHAR*)));

        //reallocation error
        if (!_tmp)
        {
                LCD_ErrLog("Couldn't realloc memory!\n");
                return;
        }

        fileList = _tmp;

    }//end num_files==files_allocated

    fileList[num_files] = item;
    num_files++;

}//end AddToArray

与..

TCHAR **fileList;
u32 num_files=0;
u32 files_allocated=0;

【问题讨论】:

    标签: c arrays dynamic free


    【解决方案1】:

    就我而言,您在数据段中声明了 fileList 指针。所以它有 NULL 初始值。当你重新分配时,它就像 malloc 一样。但是当你释放它时它仍然指向某个地方并且 realloc 失败。您可能应该设置 fileList = NULL 才能生存。

    希望这会有所帮助。

    【讨论】:

    • 你应该检查 realloc() 的文档。当您回忆起您的 reReadSD() 函数时,realloc 的行为并不符合您的要求
    • 我在 free() 语句之后添加了 fileList=NULL。现在一切都很好。真是烦死我了,谢谢!
    • 在我调用 AddToArray(temp) 之后,是否最好在 reReadSD() 中释放(temp)?我现在担心可能的泄漏。
    • @David,不,您不能,因为您将相同的指针存储在 fileList 中。如果你释放它,你会得到一个悬空指针。取消对悬空指针的引用会导致未定义的行为,正如您可能知道的那样,应该不惜一切代价避免这种行为。
    【解决方案2】:

    我看不出这段代码有什么明显的错误,除了如果free(fileList)调用标准库free函数,你只是在释放指针数组分配的内存,而不是单个字符串它的元素指向,所以你有内存泄漏。相反,您需要遍历数组并依次释放每个元素,然后再释放数组本身。但这并不能解决您的直接问题。

    我能推荐的最好的方法是调试代码,或在关键位置放置调试打印输出,以跟踪程序内部实际发生的情况。

    【讨论】:

    • 感谢您的回复。正如我上面提到的,我在 free() 语句之后添加了 fileList=NULL。我是否仍需要遍历数组并在每个元素上调用 free(fileList[i]) 或者这与 fileList=NULL 是多余的吗?
    • @David,是的,您仍然需要遍历数组并释放每个元素。
    猜你喜欢
    • 2019-11-30
    • 2011-07-18
    • 2014-02-23
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    相关资源
    最近更新 更多