【问题标题】:what is a real pointer in valgrind when detecting 'memory leak'?检测“内存泄漏”时,valgrind 中的真实指针是什么?
【发布时间】:2016-03-09 02:03:32
【问题描述】:

如文件所述:

(5)  RRR -?-> BBB  (y)DR, (n)DL

Pointer chain legend:
- RRR: a root set node or DR block
- AAA, BBB: heap blocks
- --->: a start-pointer
- -?->: an interior-pointer

Leak Case legend:
- DR: Directly reachable
- IR: Indirectly reachable
- DL: Directly lost
- IL: Indirectly lost
- (y)XY: it's XY if the interior-pointer is a real pointer
- (n)XY: it's XY if the interior-pointer is not a real pointer
- (_)XY: it's XY in either case

Valgrind Documentation

案例1:

void *RRR;
int main()
{
    RRR = malloc(4);
    RRR = (char*)RRR + 2;
    return 0;
}

输出:

==3390== LEAK SUMMARY:
==3390==      possibly lost: 4 bytes in 1 blocks

案例2:

void *RRR;
int main()
{
    RRR = malloc(4);
    *(int*)RRR = 4;
    RRR = (char*)RRR + 2;
    return 0;
}

输出:

==3414== LEAK SUMMARY:
==3414==      possibly lost: 4 bytes in 1 blocks

两种情况输出相同的结果。 '真正的指针'是什么意思?而'_'代表什么?

(y)XY: it's XY if the interior-pointer is a real pointer。如何将XY改为真正的指针?

【问题讨论】:

  • 您的 2 个案例完全相同。唯一的区别是您在第二种情况下为 RRR 指向的内存分配了一个值。 Valgrind 不在乎你分配给内存的值。两种情况下的泄漏完全相同。
  • 一旦你给指针RRR分配了一个新值,你就失去了指向你的malloc块开始的唯一指针。从 valgrind 的角度来看,这个块因此丢失了。但是,它只是“可能”丢失了,因为您仍然有一个 into 块的指针,您可以想象从中恢复原始指针。

标签: c++ linux memory-leaks valgrind


【解决方案1】:

我知道这是一个有点老的问题,但也许将来会对某人有所帮助。

您的问题与以下文档声明中的“真实指针”有关:

- (y)XY: it's XY if the interior-pointer is a real pointer
- (n)XY: it's XY if the interior-pointer is not a real pointer

此语句与内部指针有关。文档说内部指针可能是:

可能是内存中的随机垃圾值,完全不相关,纯属巧合。

在这种情况下内部指针不被认为是实指针,所以在这种情况下

(5)  RRR -?-> BBB  (y)DR, (n)DL

将被视为直接丢失内存((n)DL)。如果内部指针是指针变量,但例如前进到指向已分配内存块的中间,就像您在案例 2 中所做的那样,那么它被认为是直接可达的 ((y)DR)。

注意这是我对文档的理解,我是

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 2021-06-27
    • 2013-02-15
    • 1970-01-01
    相关资源
    最近更新 更多