【问题标题】:Valgrind Memory Leak LogValgrind 内存泄漏日志
【发布时间】:2014-06-13 09:05:52
【问题描述】:

在 valgrind 中,我们有这样的泄漏日志

==15788== 480 bytes in 20 blocks are definitely lost in loss record 5,016 of 5,501    

==20901== 112 (48 direct, 64 indirect) bytes in 2 blocks are definitely lost in loss record 3,501 of 5,122 

==20901== 1,375,296 bytes in 78 blocks are possibly lost in loss record 5,109 of 5,122

==20901== Conditional jump or move depends on uninitialised value(s)    

==20901== Use of uninitialised value of size 8

在 Valgrind 的文档中,我找不到确切的详细信息。谁能解释一下

我知道肯定会丢失 - 分配的内存根本没有释放。但是“20 块”是什么意思,“5,501 的损失记录 5,016 丢失”是什么意思。如果它说丢失了 480 个字节,是指在循环中运行一次还是总共..?

第二行中,“112(48直接,64间接)2个块中的字节肯定丢失”,是什么意思“48直接,64间接”。

而且我理解“可能丢失”的含义,但这是否意味着 valgrind 不确定它是否是泄漏..?

关于第 4 行,我完全不知道。我检查了与第 4 行一起提供的调用堆栈。我没有注意到任何“跳跃或移动”。

对于第 5 行,它表示未初始化在此代码 sn-p 的最后一行。我在这里看不到任何未初始化的值。

char *data = new char[somebigSize];
memset(data, '\0', somebigSize);
int sizeInt = sizeof(int);
int length = 20; //some value obtained
int position = 10; 
char *newPtrVar = new char[sizeInt + 1];
memset(newPtrVar, '\0', sizeInt + 1);
memcpy(newPtrVar, &length, sizeInt);
memcpy(&data[position], newPtrVar, sizeInt);

【问题讨论】:

  • 那个 sn-p 看起来不像是一个实际的 sn-p,更像是一个近似值。
  • 它是从我的代码中提取的,文件有 15K 行。我刚刚发布了确切的代码,其中 valgrind 显示使用了未初始化的值。
  • It was extracted from my code, the file had 15K lines. 然后将该块放入main() 函数中,用已知值初始化那些未知值,然后运行一个简单的程序。如果那个简单的程序没有产生这些问题,那么就是你没有发布的 14K+ 代码导致了这些问题。另外,为什么还要写这样的代码呢?为什么不使用更安全的构造,例如std::vector<char>std::string 等?
  • @PaulMcKenzie 好的,Paul 会这样做,但请您解释一下其他 valgrind 日志行

标签: c++ memory-leaks valgrind


【解决方案1】:

valgrind manual 详细介绍了这一点。这相当复杂 - 请参阅链接了解完整详情,但本质上您可以:

  • “仍然可达”(指针指向的内存)。
  • “直接丢失”(未指向任何活动指针的内存)
  • “间接丢失”(内存中“直接丢失”的指针指向的内存)
  • “可能丢失”(指向的内存,但指针未指向内存的开头)。

最后一种情况可能是一些随机指针,它可能类似于内存管理器,在内存返回给用户之前分配一个红区。

【讨论】:

    猜你喜欢
    • 2014-10-28
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 2020-03-31
    • 2016-03-15
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多