无法在以下代码中发现内存泄漏问题

Unable to spot Memory leak issue in below code

我是 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 而不是硬编码数组大小?

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

Do I need to use malloc instead of hardcoded size of array?

我认为,您对 char buffer[10000];char error_msg[10000]; 可能 未充分使用 感到困惑。这些数组 不是 动态分配的。即使数组没有被充分利用,这里也没有内存泄漏。

另外,@Vlad 先生正确地提到了另一个 很有可能 问题,actual_error_msg 是一个global,如果 trimwhitespace() 函数没有具有 global 范围的 return 值,(即,在 a() 执行完成后保持有效),它可能会导致 undefined behaviour.

为避免这种情况,请确保 trimwhitespace() 函数是 returning (假设 return 类型是 char *

  • 具有动态内存分配的指针(首选)
  • static 数组的基地址。 (不好的做法,但会奏效)

详细说明,来自 Wikipedia 关于 "memory leak"

的文章

In computer science, a "memory leak" is a type of resource leak that occurs when a computer program incorrectly manages memory allocations in such a way that memory which is no longer needed is not released. ...

.. Typically, a memory leak occurs because dynamically allocated memory has become unreachable. ...

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

OTOH,dynamic memory allocation,内存分配在运行时执行。编译器没有关于分配的信息,内存是以编程方式分配的,因此也需要以编程方式释放。否则会导致 "memory leak".

如果变量 actual_error_msg 是一个全局变量并且函数 trimwhitespace 没有为 error_msg

的副本动态分配内存,则似乎存在未定义的行为
actual_error_msg = trimwhitespace(error_msg);

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

Can anyone please suggest on this

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

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

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