2012-04-26 3 views
2

Я представил ошибку памяти с следующим фрагментом кода C:Valgrind (MemCheck) инструмент didnot обнаружения памяти утечек

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char** argv){ 
int i; 
int *a = (int *)malloc(sizeof(int) * 10); 
if (!a) return -1; /*malloc failed*/ 
for (i = 0; i < 11; i++){ 
    a[i] = i; 
} 

for (i = 0; i < 11; i++){ 
printf("a[%d] = %d\n",i ,a[i]); 
} 
// free(a); 
return 0; 
} 

MemCheck обнаруживает ошибки Invalid чтения/запись и, безусловно, утерянные, что является правильным и ожидаемым.

Теперь я добавил один и тот же фрагмент кода к общему объекту (.so) моего приложения. Это приложение работает как служба и является процессом демона. Он никогда не выходит. Я применил valgrind к моему приложению и вызвал измененный «.so».

Memcheck обнаруживает неправильные ошибки чтения/записи, но не определенно потерян, хотя все эти ошибки находятся в одном методе. Можно ли получить некоторую помощь в том, что memcheck обнаруживает утечку памяти (определенно потерянную)?

Спасибо заранее, PV

+0

Вы жалуетесь, что Valgrind не обнаруживает утечку памяти в неподвижном приложении? Насколько я знаю, Valgrind не может обнаружить утечки памяти до тех пор, пока процесс не завершится - другими словами, вам придется остановить демона до того, как будут сообщены ошибки. –

ответ

7

Как VALGRIND знать, что вы потеряли след вашей выделенной памяти? В конце программы он мог видеть, что память не освобождается, но это все, что она может сделать для вас. И если программа никогда не выйдет, valgrind думает, что вы все еще можете освободить ее позже.

Даже если valgrind проверит все переменные и попытается обнаружить, что никто не указывает на начало выделенной памяти: совершенно правильно хранить адрес в некоторой модифицированной форме; например, к байту за реальным началом (думаю, строки Паскаля). Таким образом, valgrind не может определить, знает ли ваш код о выделенной памяти. Таким образом, валгринд не мог вам помочь.

-1

Я думаю, что вы имеете в виду

for (i = 0; i < 10; i++) 

Было бы желательно, однако, чтобы положить

#define N 10 

или

const int N = 10; 

в начале вашего кода, а затем использовать символ N, а не 10.

+2

Но тогда это не была бы ошибка памяти, которая является одной из вещей, которые автор пытается обнаружить с помощью valgrind ... –

0

Чтобы на самом деле сделать valgrind обнаружение утечки, вы должны повлиять на другое значение до a.

Попробуйте добавить:

a = NULL; 

после для() петли.

Теперь valgrind должен жаловаться!
Это не скажет вам, что вы «безвозвратно потеряли» свою память, если не потеряете .

+0

Как бы valgrind _know_, что память действительно просочилась? – Vlad

+0

Ну, если вы потеряете отслеживание * значения * указателя alloc'ed, вы не сможете его восстановить.У Valgrind есть функция, где он знает, когда область памяти не указана никаким значением в программе, точно так же, как сборщик мусора. – Gui13

+0

не очень. Например, я могу выгрузить указатель на файл и перезагрузить его позже. Я могу xor указатель с константой, чтобы уменьшить вероятность стека. Я могу упаковать несколько указателей плотно, удалив конечные 0 (выделенные указатели часто имеют 0s в конце из-за выравнивания). Я могу сохранить указатель на следующий байт, если я использую 0-й байт для длины (например, строки Pascal). Существуют тысячи допустимых ситуаций, когда у меня нет переменной в моем коде, равной выделенному значению указателя, но я могу восстановить исходный указатель и освободить его. – Vlad

Смежные вопросы