无法发现下面代码中的内存泄漏问题

Unable to spot Memory leak issue in below code

本文关键字:内存 泄漏 问题 代码 发现      更新时间:2023-10-16

我是一个c++新手。我在我的c++代码中面临内存泄漏问题。请查看下面提到的代码片段,这是导致问题的原因。

void a()
{
    char buffer[10000];
    char error_msg[10000];
    char log_file[FILENAME_L] = "error_log.xml";
    FILE *f;
    f = fopen(log_file,"r");
    while (fgets(buffer, 1000, f) != NULL)
    {
        if (strstr(buffer, " Description: ") != NULL)
        {
            strcpy(error_msg, buffer);
        }
    }
    fclose(f);  
    actual_error_msg = trimwhitespace(error_msg);
}
谁能给点建议吗?我需要使用malloc而不是硬编码数组的大小吗?

如果变量actual_error_msg是全局变量,并且函数trimwhitespace没有为error_msg的副本动态分配内存,则似乎存在未定义的行为

actual_error_msg = trimwhitespace(error_msg);

所以当函数完成它的执行指针actual_error_msg将是无效的

有谁能给点建议吗

我建议在函数trimwhitespace中为error_msg的副本分配动态内存。或者如果你已经自己做了,那么检查内存是否被及时释放。:)

考虑到buffer被声明为等于10000的大小,而在fgets中使用了幻数1000,这看起来很奇怪。

char buffer[10000];
//,,,
while (fgets(buffer, 1000, f) != NULL)

TL;DR -在上面显示的代码片段中,没有内存泄漏。

我需要使用malloc而不是硬编码数组的大小吗?

我想,你被char buffer[10000];char error_msg[10000];可能的未充分使用弄糊涂了。这些数组是动态分配的而不是。即使数组没有被充分使用,这里也没有内存泄漏。

此外,由于@Vlad先生正确地提到了在您的情况下另一个可能的问题,actual_error_msg全局,如果trimwhitespace()函数没有具有全局作用域的返回值(即在a()完成执行后保持有效),它可能会导致未定义的行为。

为了避免这种情况,请确保trimwhitespace()函数返回(假设返回类型为char *)
  • 动态内存分配指针(首选)
  • static阵列的
  • 基址。(不好的做法,但将工作)

详细说明,来自维基百科关于"内存泄漏"的文章

在计算机科学中,"内存泄漏"是一种资源泄漏,发生在计算机程序错误地管理内存分配时,导致不再需要的内存不被释放. ...

. .通常,发生内存泄漏是因为动态分配的内存变得不可达. ...

当内存由编译器分配时,没有内存泄漏的范围,因为内存(de)分配由编译器管理。

OTOH,动态内存分配,内存分配在运行时执行。编译器没有关于内存分配的信息,内存是以编程方式分配的,因此也需要以编程方式释放。如果不这样做,将导致"内存泄漏"。