我是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而不是硬编码的数组大小?
答案 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,内存分配在运行时执行。编译器没有关于分配的信息,内存以编程方式分配 ,因此也需要以编程方式释放。如果不这样做会导致“内存泄漏”。