2013-04-06 2 views
1

어리석은 질문 일 수 있습니다. 무언가 같이valgrind로 인한 메모리 누출

char **getArrayOfStrings(int rows, int cols){ 
    int i; 
    char **aux = malloc(rows * sizeof(char*)); 

    for(i = 0; i < rows; i++) 
     aux[i] = malloc(cols+1); 

    return aux; 
} 

이 나에게 '문자열'의 배열을 반환, 중요한 코드의 덩어리입니다 : freeMemory에서이

void f(...) 
{ 
char **arrayOfStrings; 
    int i = 0; 
    arrayOfStrings = getArrayOfStrings(ROWS,COLS); 

    while(ch != '.' && sscanf (globalString,"%[^,|.]s", arrayOfStrings[i]) > 0)  
    { 
     globalString += strlen(arrayOfStrings[i++]) + 1;  
     ch = (*globalString-1);     /** take the terminal characters */ 
    } 

    freeMemory(&arrayOfStrings,ROWS); 

} 

입니다 :

void freeMemory(char ***matrix, int size){ 
    int i; 

    for(i = 0; i < size; i++) free((*matrix)[i]); 

    free(*matrix); 

    *matrix = NULL; 
} 
나는 다음과 같은 기능을 수행했다

내 응용 프로그램을 마친 후 valgrind를 실행하여 메모리 누수를 찾습니다 (처음 valgrind를 사용하고 있습니다). 함수 getArrayOfStrings 나 (물론 난 그냥 하나의 malloc을 사용할 수도 있지만 다른 문제에 완벽하게 정상적으로 것 때문에 내가 놓친 거지 모르는

Finding Invalid Pointer Use With Valgrind 

    ==25012== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. 
    ==25012== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info 
    ==25012== Command: dist/Debug/GNU-MacOSX/app 
    ==25012== 
    ==25012== Invalid read of size 8 
    ==25012== at 0x406445: f (Data.c:24) 
    ==25012== by 0x400BE3: main (main.c:27) 

:

그리고 나는 다음과 같은 오류가 발생합니다).


편집. (: 24 data.c 이것) :

Valgrind의 내 경험에
char **aux = malloc(rows * sizeof(char*)); 
+3

당신의 동안 조건에 i < ROWS 같은 것을 포함하는 것이 좋습니다? – chris

+2

어떻게'arrayOfStrings'을 사용하고 있습니까? – md5

+3

Data.c의 라인 번호 24에 무엇이 있으며 main.c의 라인 번호 27에 무엇이 있습니까? –

답변

2

, 정확히 불법적 인 접근이 이루어집니다되었다 보여줍니다 Valgrind의 표시

라인이 하나의 F입니다. 그러나 출력은 잘못된 액세스 및 할당 된 위치와 관련된 포인터 만 표시합니다.

우리는 잘못된 코드 줄을보고있을 수 있습니다.

은 가깝게 while 루프에서 상대 :

while(ch != '.' && sscanf (globalString,"%[^,|.]s", arrayOfStrings[i]) > 0)  
{ 
    globalString += strlen(arrayOfStrings[i++]) + 1;  
    ch = (*globalString-1);     /** take the terminal characters */ 
} 

는 어떤 이유로, 마지막 행 ch에 않는 경우 불법적 인 접근은 arrayOfStrings[rows]으로 수행 할 것 같지 .. 행 +1을 할당하면 해결 방법입니다. 내용은 알 수없고 확률은 .이 없으므로 while 조건을 잘못된 액세스로 거짓으로 평가합니다.

나는 중 하나 . 최종 반복에 존재 확인하고 또는`freeMemory` 무엇

+1

좋은 점 - 제 "답"은 실제로 해결 방법입니다 - 제가 의견에 깔끔하게 들어갈 수없는 문제를 이해하려는 시도가 더 많습니다. 질문에 아무 것도 추가하지 않아 삭제했습니다. –