无法发现下面代码中的内存泄漏问题
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而不是硬编码数组的大小吗? 如果变量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,动态内存分配,内存分配在运行时执行。编译器没有关于内存分配的信息,内存是以编程方式分配的,因此也需要以编程方式释放。如果不这样做,将导致"内存泄漏"。
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏