Нулевые байты потеряны в Valgrind - PullRequest
7 голосов
/ 31 марта 2011

Что это означает, когда Valgrind сообщает о потерянных байтах, как здесь:

==27752== 0 bytes in 1 blocks are definitely lost in loss record 2 of 1,532

Я подозреваю, что это просто артефакт от творческого использования malloc, но это хорошо, чтобы быть уверенным (-;

РЕДАКТИРОВАТЬ: Конечно, реальный вопрос заключается в том, можно ли его игнорировать или это эффективная утечка, которая должна быть исправлена ​​путем освобождения этих буферов.

Ответы [ 2 ]

13 голосов
/ 04 апреля 2011

Да, это настоящая утечка, и ее следует исправить.

Когда вы malloc(0), malloc может либо дать вам NULL, либо адрес, который гарантированно будет отличаться от указанного.любого другого объекта .

Поскольку вы, скорее всего, используете Linux, вы получаете второй.Нет места для самого выделенного буфера, но libc должна выполнить некоторую уборку , и это приводит к пустой трате, поэтому вы не можете продолжать malloc(0) бесконечно.

Вы можете наблюдать это с:

#include <stdio.h>
#include <stdlib.h>
int main() {
  unsigned long i;
  for (i = 0; i < (size_t)-1; ++i) {
    void *p = malloc(0);
    if (p == NULL) {
      fprintf(stderr, "Ran out of memory on %ld iteration\n", i);
      break;
    }
  }
  return 0;
}

gcc t.c && bash -c 'ulimit -v 10240 && ./a.out'
Ran out of memory on 202751 iteration
1 голос
/ 31 марта 2011

Похоже, вы выделили блок размером 0, а затем не освободили его.

...