Различные утечки памяти в различной аппаратной архитектуре - PullRequest
1 голос
/ 08 декабря 2010

Я имею дело с утечкой памяти в коде C в эти дни. Я поражен, увидев разные утечки памяти в разных аппаратных архитектурах.

Ниже приводится сумма утечек, показанная valgrind в 64-битной архитектуре:

                LEAK SUMMARY:
      ==4064==    definitely lost: 1,600,192 bytes in 7 blocks
      ==4064==    indirectly lost: 0 bytes in 0 blocks
      ==4064==      possibly lost: 0 bytes in 0 blocks
      ==4064==    still reachable: 3,217,416 bytes in 2,155 blocks
      ==4064==         suppressed: 0 bytes in 0 blocks
      ==4064== Reachable blocks (those to which a pointer was found) are not shown. 
      ==4064== To see them, rerun with: --leak-check=full --show-reachable=yes
      ==4064== 
      ==4064== For counts of detected and suppressed errors, rerun with: -v
       ==4064== ERROR SUMMARY: 7 errors from 7 contexts (suppressed: 4 from 4)

И следующее для 32-битной архитектуры

     LEAK SUMMARY:
    ==29607==    definitely lost: 1,600,048 bytes in 4 blocks .
    ==29607==    indirectly lost: 456 bytes in 33 blocks.
    ==29607==      possibly lost: 0 bytes in 0 blocks.
    ==29607==    still reachable: 96 bytes in 12 blocks.
    ==29607==         suppressed: 0 bytes in 0 blocks.
    ==29607== Reachable blocks (those to which a pointer was found) are not shown.
    ==29607== To see them, rerun with: --show-reachable=yes

Какие могут быть причины для этого.

Ответы [ 3 ]

4 голосов
/ 08 декабря 2010

Ну, я не знаю точных деталей и всего, но если вы потеряете некоторые данные, которые были основаны на размере какого-либо типа, утечка приведет к увеличению количества байтов для 64-битного по сравнению с 32-битным бит.

Например, если вы пропустили этот фрагмент данных:

// arr holds an array of 10 pointers
int *arr = malloc(10 * sizeof(int *));

Утечка приведет к увеличению на 64-битной (по сравнению с 32-битной), потому что размер int * зависит от платформы.

2 голосов
/ 08 декабря 2010

Возможно, есть какие-то ошибки в библиотеках на вашей 64-битной машине?

В качестве альтернативы, некоторый ваш код может приводить указатели к 32-битным целым числам и обратно, вызывая хаос.

1 голос
/ 09 декабря 2010

Если у вас есть что-то вроде переполнения массива или записи данных через неверный указатель, вы можете ожидать, что расположение памяти на разных машинах будет разным. Так что если вы делаете:

void * foo(void) {
     char str[100];
     void * p = malloc(100);
     memset(str, 0, 111);
     /* ... more code ... */
     return p;
}

Тогда вы можете представить, что и str, и p находятся в стеке. Порядок их размещения может отличаться, а также то, сколько дополнительных байтов может быть выделено в стеке для их заполнения, поэтому ошибка в длине memset может потерять ссылку на вновь выделенную память или не , В зависимости от множества других вещей, ошибка memset может или не может быть замечена valgrind, но мне нужно было использовать простой случай, который легко понять.

Это может или не может быть похоже на то, что происходит, но я думаю, что это демонстрирует тип вещи, которая может произойти.

...