本文介绍了Valgrind-由于什么原因,积木仍然可以到达?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试找出是什么原因导致Valgrind警告某些"仍可到达"的阻塞。我已经检查了我的代码,没有发现任何Free()遗漏。我尝试使用--leak-check=yes--show-reacable=yes选项运行,以下是输出示例:

==2999== 616 bytes in 7 blocks are still reachable in loss record 8 of 9
==2999==    at 0xD9C3: calloc (vg_replace_malloc.c:597)
==2999==    by 0x3188FA: _xpc_calloc (in /usr/lib/system/libxpc.dylib)
==2999==    by 0x3191D4: _xpc_base_create (in /usr/lib/system/libxpc.dylib)
==2999==    by 0x31FBEA: xpc_string_create (in /usr/lib/system/libxpc.dylib)
==2999==    by 0x31EDFD: xpc_dictionary_set_string (in /usr/lib/system/libxpc.dylib)
==2999==    by 0x320E8C: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==2999==    by 0x1BE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==2999==    by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==2999==    by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==2999==    by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==2999==    by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==2999==    by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)


==2999== 4,096 bytes in 1 blocks are still reachable in loss record 9 of 9
==2999==    at 0xC713: malloc (vg_replace_malloc.c:274)
==2999==    by 0x17F3F7: __smakebuf (in /usr/lib/system/libsystem_c.dylib)
==2999==    by 0x175D19: __swsetup (in /usr/lib/system/libsystem_c.dylib)
==2999==    by 0x1766C3: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==2999==    by 0x17618D: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==2999==    by 0x17F2CF: printf (in /usr/lib/system/libsystem_c.dylib)
==2999==    by 0x100003D21: printEstBasica (mod_dados.c:100)
==2999==    by 0x100001635: main (mod_main.c:179)

我理解的代码行要么指的是‘打印’函数(如printEstBasica),在这些函数上我只使用printf或fprint tf的函数...其他的我不知道它们是什么..我在其他帖子上看到有人说,它可能指的是编译器使用的附加信息……但我不确定。有一件事让我想到:我对不同的数据集(将由程序处理)运行valgrind,它们具有不同的大小,仍然可以到达的字节数总是相同的。

提前谢谢!

推荐答案

要求Valgrind使用--show-reachable=yes标志向您介绍它们。如果您不想看到它们,请不要使用该标志。

现在,您的真正的问题可能是"什么是可访问的块,我应该关心吗?"。

答案是:不完全是。仍然可到达的块意味着程序可以释放()它们(如果它想要的话)(它仍然可以找到==到达它们),只是不在乎这样做。

以下是将生成"仍可访问"的程序的示例:

int DoSomething()
{
  // Heap-allocated so as not to exhaust stack.
  // Allocated only once.
  static char *const error_buf = malloc(10000);
  return DoSomethingWithErrorBuf(error_buf);
}

int main()
{
  return DoSomething();
}

这篇关于Valgrind-由于什么原因,积木仍然可以到达?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-28 22:21