2010-12-08 2 views
1

В настоящее время я занимаюсь утечкой памяти в коде 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 

Что может быть причины для этого.

+2

Выход для нормально выходящей программы? Если он существует при сбое, он может терпеть неудачу в разных местах. Поскольку аварии обычно имеют отношение к управлению памятью, это может привести к сбою немного раньше или позже в каждой архитектуре, следовательно, большая разница. Обратите также внимание на то, что 64 бит обычно использует гораздо больше памяти, чем 32 бита (т. Е. Размер указателя и т. Д.). – 2010-12-08 20:55:52

ответ

4

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

Например, если вы просачиваться этот кусок данных:

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

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

2

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

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

1

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

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

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

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