Я знаю, что здесь есть похожая тема об этой проблеме и на этом сайте. https://live.gnome.org/Valgrind объяснили, я написал свою простую программу ниже
#include <glib.h>
#include <glib/gprintf.h>
#include <iostream>
int main()
{
const gchar *signalfound = g_strsignal(1);
std::cout << signalfound<< std::endl;
return 0;
}
но когда я попытался проверить с помощью valgrind с помощью этой команды
G_DEBUG = gc-friendly G_SLICE = всегда-malloc valgrind —leak-check = полное —leak-resolution = высокое ./g_strsignal
и вот результат
==30274== Memcheck, a memory error detector
==30274== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==30274== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==30274== Command: ./g_strsignal
==30274== Parent PID: 5201
==30274==
==30274==
==30274== HEAP SUMMARY:
==30274== in use at exit: 14,746 bytes in 18 blocks
==30274== total heap usage: 24 allocs, 6 frees, 23,503 bytes allocated
==30274==
==30274== LEAK SUMMARY:
==30274== definitely lost: 0 bytes in 0 blocks
==30274== indirectly lost: 0 bytes in 0 blocks
==30274== possibly lost: 0 bytes in 0 blocks
==30274== still reachable: 14,746 bytes in 18 blocks
==30274== suppressed: 0 bytes in 0 blocks
==30274== Reachable blocks (those to which a pointer was found) are not shown.
==30274== To see them, rerun with: --leak-check=full --show-reachable=yes
==30274==
==30274== For counts of detected and suppressed errors, rerun with: -v
==30274== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Я заметил, что то, что было сказано Валгриндом: «Достижимые блоки (те, на которые был найден указатель) не отображаются». тогда я пытаюсь проверить gmem.c
источник на соответствующей функции, так как я использовал версию glib-2.35.4. Я нашел следующий код
gpointer
g_malloc (gsize n_bytes)
{
if (G_LIKELY (n_bytes))
{
gpointer mem;
mem = glib_mem_vtable.malloc (n_bytes);
TRACE (GLIB_MEM_ALLOC((void*) mem, (unsigned int) n_bytes, 0, 0));
if (mem)
return mem;
g_error ("%s: failed to allocate %"G_GSIZE_FORMAT" bytes",
G_STRLOC, n_bytes);
}
TRACE(GLIB_MEM_ALLOC((void*) NULL, (int) n_bytes, 0, 0));
return NULL;
}
И мой вопрос
Является ли это все еще нормальной ситуацией, когда valgrind сказал: «Доступные блоки (те, на которые был найден указатель) не показаны.», И я думаю, что это утверждение относится к приведенной выше функции g_malloc, в которой возвращается mem переменная gpointer?
Если нет, то есть ли альтернативы для решения, «все еще достижимые: 14 746 байт в 18 блоках», о чем Валгринд сказал выше?
Я бегу x86 Fedora 18
Спасибо
Скорее всего, это относится к динамически распределенной памяти, возвращаемой функцией g_strsignal()
,
Вэлгринд говорит «Достижимые блоки ….», потому что действительный указатель (signalfound
) по-прежнему указывает на динамически распределенную память.
Если Valgrind обнаружит, что указатель на указатель на динамическую память потерян (перезаписаны) Затем он сообщает «определенная утечка …», Поскольку он может окончательно сказать, что динамический блок памяти никогда не может быть освобожден. В вашем случае указатель по-прежнему указывает на блок, valgrind не предполагает, что он потерян, но предполагает, что он, вероятно, задуман.
Других решений пока нет …