无法在以下代码中发现内存泄漏问题
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)
我是 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)