Valgrind вывод Понимание - PullRequest
       40

Valgrind вывод Понимание

1 голос
/ 07 октября 2011
==20420== 
==20420== HEAP SUMMARY:
==20420==     in use at exit: 0 bytes in 1 blocks
==20420==   total heap usage: 1 allocs, 0 frees, 0 bytes allocated
==20420== 
==20420== Searching for pointers to 1 not-freed blocks
==20420== Checked 48,492 bytes
==20420== 
==20420== 0 bytes in 1 blocks are still reachable in loss record 1 of 1
==20420==    at 0x400677E: malloc (vg_replace_malloc.c:195)
==20420==    by 0x80483D8: main (jig.c:10)
==20420== 
==20420== LEAK SUMMARY:
==20420==    definitely lost: 0 bytes in 0 blocks
==20420==    indirectly lost: 0 bytes in 0 blocks
==20420==      possibly lost: 0 bytes in 0 blocks
==20420==    still reachable: 0 bytes in 1 blocks
==20420==         suppressed: 0 bytes in 0 blocks

Смотрите в своем проекте, я использую malloc следующим образом:

malloc(sizeof(some_structure) * some_expression);

в какой-то момент some_expression дает значение 0, так что косвенно я делаю

   malloc(0)

Так что, когда яЯ не собираюсь выделять один байт, поэтому я не освобождаю его, но в этом случае valgrind обнаруживает утечку памяти.Почему?

Редактировать:

Если я использую вот так:

char *a = malloc(0);

Тогда a не NULL.Так что вопрос, почему не NULL?& Какой адрес он хранит?

1 Ответ

6 голосов
/ 07 октября 2011

Из моей malloc(3) справочной страницы (Linux):

Если размер равен 0, то malloc() возвращает либо NULL, либо уникальное значение указателя, которое впоследствии может быть успешно передано free().

Так что нет никакой гарантии, что malloc не выделяет никакого пространства, когда вы передаете его 0, и вам нужно free указатель, который он вам дает, если это не NULL.

Если malloc не возвращает NULL, вы получаете буфер, который вы ни для чего не можете использовать, но, поскольку он имеет уникальный адрес, malloc должен был выделить хотя бы один байт.

Возможно, вы захотите заменить вызов malloc на

.
// like malloc, but guarantees NULL return value if n==0
void *malloc0(size_t n)
{
    return n ? malloc(n) : NULL;
}
...