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

时间:2015-06-10 14:08:36

标签: c++ memory-leaks

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

2 个答案:

答案 0 :(得分:2)

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

actual_error_msg = trimwhitespace(error_msg);

因此,当函数完成其执行时,指针actual_error_msg将无效。

  

任何人都可以在此建议

我建议在函数error_msg内为trimwhitespace的副本动态分配内存。或者,如果您已经自己完成,请检查内存是否已及时释放。:)

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

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

答案 1 :(得分:1)

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

  

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

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

此外,正如 @Vlad 先生正确地提到了您的案例中的另一个可能的问题,actual_error_msg全球 ,如果trimwhitespace()函数没有具有全局范围的返回值(即,在a()完成执行后保持有效),则可能导致到undefined behaviour

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

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

详细说明,请参阅Wikipedia关于“内存泄漏”的文章

  

在计算机科学中,“内存泄漏”是一种资源泄漏,当计算机程序错误地管理内存分配时,会发生不再需要的内存。 ...

  

..通常,发生内存泄漏,因为动态分配的内存已无法访问。 ...

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

OTOH,dynamic memory allocation,内存分配在运行时执行。编译器没有关于分配的信息,内存以编程方式分配 ,因此也需要以编程方式释放。如果不这样做会导致“内存泄漏”。