【问题标题】:C problem with memory leaks (realloc function)C 内存泄漏问题(realloc 函数)
【发布时间】:2020-09-19 01:52:51
【问题描述】:

scanFolderPath - 包含文件的文件夹路径。

filesToScan - 带有文件名的字符串数组。

我对 realloc 行(for 循环中的第三行)有疑问。我不明白为什么!感谢您对程序员社区的帮助;)

char* filePath = malloc(0);
char* fileContent = 0;
char* partContent = 0;
FILE* fileToScan;
int i = 0, j = 0, virus = FALSE, flag = FALSE, counter = 0;
for (i = 0; i < amountOfFiles; i++)
{
    flag = FALSE;
    if (scanFolderPath != NULL && filesToScan[i] != NULL)
    {
        realloc(filePath, (sizeof(char) * (strlen(scanFolderPath) + 1 + strlen(filesToScan[i]))));
    }
    strcpy(filePath, "");
    getFilePath(filePath, scanFolderPath, filesToScan[i]);
    fileToScan = fopen(filePath, "rb");
    readFile(&fileContent, filePath);
    if (choice == '0')
    {
        virus = scanSingature(fileContent, virusSingature, getLength(fileToScan), virusSingatureLen);
        if (virus)
        {
            printf("%s - Infected!\n", filePath);
            fprintf(logsFile, "%s", filePath);
            fprintf(logsFile, "  Infected!\n");
        }
        else
        {
            printf("%s - Clean\n", filePath);
            fprintf(logsFile, ("%s", filePath));
            fprintf(logsFile, "  Clean\n");
        }
        fclose(fileToScan);
        strcpy(filePath, "");
    }
}

【问题讨论】:

  • 您正在丢弃realloc 返回的新指针值。您必须将其分配给指针变量。
  • 谢谢!但最后当我添加“free(filePath)”时出现错误。
  • 那是因为filePath原来的值已经失效了。
  • ...这是传递给realloc的效果之一。
  • 那么我怎样才能释放这个内存呢?

标签: c memory-management memory-leaks heap-memory realloc


【解决方案1】:

realloc 返回新分配的块。您没有分配任何东西,因此重新分配的内存会丢失,并且您的指针指向无效内存(假设 realloc 成功)。

正确的重新分配方式:

void *p = malloc(10);
void t;

/* ... */

t = realloc(p, 20);
if(t) p = t;            //check if the realloc was successful 

/* ... */

free(p)

【讨论】:

    【解决方案2】:

    试试

    filePath = realloc(filePath, (sizeof(char) * (strlen(scanFolderPath) + 1 + strlen(filesToScan[i]))));
    

    这样文件路径的内容被重新分配,指针返回到文件路径

    【讨论】:

      猜你喜欢
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2015-05-09
      相关资源
      最近更新 更多