C++ Valgrind“合法”;“可能丢失”;字节示例

C++ Valgrind“合法”;“可能丢失”;字节示例,c++,c,valgrind,C++,C,Valgrind,我看到valgrind将内存泄漏分为: 肯定输了 间接损失 可能丢失 仍然可以到达 压制 我刚刚修复了一个漏洞,“可能丢失”是主要问题 “可能丢失表示您的程序正在泄漏内存,除非您正在使用指针执行异常操作,可能导致指针指向已分配块的中间;有关某些可能的原因,请参阅用户手册” 请允许我知道一个“使用指针做不寻常的事情,可能导致指针指向分配块的中间”的示例 我指的是一个可以忽略“可能丢失”的例子,尽管valgrind报告了这一点。在这个例子中,指针的使用让valgrind抱怨,但同时以这种方式使用

我看到valgrind将内存泄漏分为:

  • 肯定输了
  • 间接损失
  • 可能丢失
  • 仍然可以到达
  • 压制
我刚刚修复了一个漏洞,“可能丢失”是主要问题

可能丢失表示您的程序正在泄漏内存,除非您正在使用指针执行异常操作,可能导致指针指向已分配块的中间;有关某些可能的原因,请参阅用户手册”

请允许我知道一个“使用指针做不寻常的事情,可能导致指针指向分配块的中间”的示例

我指的是一个可以忽略“可能丢失”的例子,尽管valgrind报告了这一点。在这个例子中,指针的使用让valgrind抱怨,但同时以这种方式使用指针在某种程度上是合法的


感谢您

文档中的一些示例说明了不同的库有自己的分配器,并且返回的内存不是底层OS分配器(malloc/sbrk)直接返回的指针,而是偏移量后的指针。例如,一个分配器获得一些额外的内存和存储的元信息(可能是垃圾收集器的类型信息……)。分配和解除分配的过程类似于:

char *p = malloc(100);
if (p != 0)
{
    p += 50;
    /* at this point, no pointer points to the start of the allocated memory */
    /* however, it is still accessible */
    for (int i = -50; i != 50; i++)
        p[i] = 1;
    free (p - 50);
}
void* allocate( size_t size ) {
   metainfo_t *m = (metainfo_t*) malloc( size + sizeof(metainfo) );
   m->data = some_value;
   return (void*)(m+1);          // [1]
}
void deallocate( void* p ) {
   metainfo_t *m = ((metainfo_t*)p) - 1;
   // use data
}
void * memory = allocate(10);
当valgrind跟踪内存时,它会记住由
malloc
返回的原始指针,并且该指针不会存储在程序中的任何位置。但这并不意味着内存已经泄漏,它只意味着指针不能直接在程序中使用。特别是
内存
仍然保留返回的指针,可以调用
解除分配
来释放它,但是
valgrind
在程序中的任何位置
(char*)memory-sizeof(metadata_t)
都看不到原始返回的指针,并发出警告

char *p = malloc(100);
if (p != 0)
{
    p += 50;
    /* at this point, no pointer points to the start of the allocated memory */
    /* however, it is still accessible */
    for (int i = -50; i != 50; i++)
        p[i] = 1;
    free (p - 50);
}
因为它看起来很有趣,所以我确实运行了代码并对其进行了修改。结果如下

yjaeyong@carbon:~$ valgrind test
==14735== Memcheck, a memory error detector
==14735== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==14735== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info
==14735== Command: test
==14735== 
==14735== 
==14735== HEAP SUMMARY:
==14735==     in use at exit: 0 bytes in 0 blocks
==14735==   total heap usage: 32 allocs, 32 frees, 2,017 bytes allocated
==14735== 
==14735== All heap blocks were freed -- no leaks are possible
==14735== 
==14735== For counts of detected and suppressed errors, rerun with: -v
==14735== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 6)

它说不可能有泄漏。我遗漏了什么吗?

请将评论作为评论,而不是答案。StackOverflow会通知用户对其答案的评论,但不会(也不应该)通知也回答相同问题的其他用户。也就是说……代码最终释放了内存,所以valgrind没有看到它。我的意思是,如果程序在达到<代码>免费< /代码>之前(或者根本不自由),并且<>代码> p>代码>设置,则ValgRink将考虑可能丢失的分配内存。测试时,为了使
p
保持设置,您可能还需要将
p
设置为全局。我尝试将其作为注释发布,但注释的字符数有限制。对不起。如果程序在到达空闲之前退出(或者根本不自由),P保持设置,则ValgRink将考虑分配的内存可能丢失。哦,我明白了