2012-09-27 2 views
0

두 개의 이중 변수에 메모리를 할당하는 함수를 작성했습니다. 필요한 메모리 크기가 작을 때 작동하지만 필요한 메모리가 상대적으로 커지면 seg 오류가 발생합니다. 서면 코드에 오류나 불량 사례가 있습니까?malloc seg 오류

void RDF_MALLOC(void** p, size_t sz){ 

*p = malloc(sz); 
    if (*p == NULL){ 
     RDF_LOG(kERROR, "Insufficient memory.\n"); 
    } else { 
     memset(*p, 0x00, sz); 
    } 
} 

void RDF_FREE(void* p){ 
    if (p != NULL){ 
     free(p); 
     p = NULL; 
    } else { 
     RDF_LOG(kERROR, "Fail to free memory.\n"); 
    } 
} 

void calcErr(){ 

    int PTCORE_MAX_SESSION_NODE = 1800; 

    double* sum_least_square_err = NULL; 
    double* node_sum_least_square_err = NULL; 

    RDF_MALLOC((void**)&sum_least_square_err, PTCORE_MAX_SESSION_NODE*PTCORE_MAX_SESSION_NODE); 
    RDF_MALLOC((void**)&node_sum_least_square_err, PTCORE_MAX_SESSION_NODE); 

    /* run qsort to sort content in sum_least_square_err , and node_sum_least_square_err...*/ 

    RDF_FREE(sum_least_square_err); 
    RDF_FREE(node_sum_least_square_err); 
} 

내가 런타임 오류의 두 가지 유형을 얻을, 하나의 malloc에 ​​실패하거나 잘못된 포인터 때 ....() 무료

오류 1 :

`malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.` 

오류 2 :

*** glibc detected *** ./pt: free(): invalid pointer: 0x0b302ba8 *** 
+0

'RDF_MALLOC()'의'p' 포인트는 어디에 있습니까? 그것은 선언되지 않았습니다. – trojanfoe

+0

죄송합니다. 실수를했습니다. 실제 코드 – twfx

+4

끔찍한 코드를 반영하도록 편집했습니다. 'void ** '를 사용하지 않고'RDF_MALLOC()'에서 새로운 포인터를 반환하십시오; ** 많은 ** 청소기가 될 것입니다. 'RDF_FREE()'의'p = NULL'은 아무것도하지 않습니다. 그 외에는 malloc/free 코드에 문제가 없음을 알 수 있습니다. – trojanfoe

답변

1

나는 당신이 double 배열을 오버 플로우하는 실제 크기. qsort 코드를 붙여 넣을 때 분명하지만 비교 함수에서는 두 개의 double을 비교할 것이고 double은 8 바이트를 취합니다. malloc은 많은 문자를 바이트이 인수로 전달할 때 할당합니다.

RDF_MALLOC((void**)&sum_least_square_err, PTCORE_MAX_SESSION_NODE*PTCORE_MAX_SESSION_NODE * sizeof(double)); 
RDF_MALLOC((void**)&node_sum_least_square_err, PTCORE_MAX_SESSION_NODE*sizeof(double));