2013-10-07 40 views
1

我有一個嘗試釋放無效指針

*** glibc detected *** [...] free(): invalid pointer: 0x0804d0d0 *** 
在這個函數

ptrGBloque determinar_nodo(const char* path){ 
    // Si es el directorio raiz, devuelve 0: 
    if(!strcmp(path, "/")) return 0; 

    int fd, i, nodo_anterior, aux; 
    // Super_path usado para obtener la parte superior del path, sin el nombre. 
    char *super_path = (char*) malloc(strlen(path)), *nombre = (char*) malloc(strlen(path)); 
    char *start = nombre, *start_super_path = super_path; //Estos liberaran memoria. 
    struct grasa_file_t *node, *inicio; 
    unsigned char *node_name; 
    strcpy(super_path, path); 
    strcpy(nombre, path); 
    // Obtiene y acomoda el nombre del archivo. 
    if (lastchar(path, '/')) { 
      nombre[strlen(nombre)-1] = '\0'; 
    } 
    nombre = strrchr(nombre, '/'); 
    nombre[0] = '\0'; 
    nombre = &nombre[1]; // Acomoda el nombre, ya que el primer digito siempre es '/' 

    // Acomoda el super_path 
    if (lastchar(super_path, '/')) { 
      super_path[strlen(super_path)-1] = '\0'; 
    } 
    aux = strlen(super_path) - strlen(nombre); 
    super_path[aux] = '\0'; 

    nodo_anterior = determinar_nodo(super_path); 

    // Abrir conexion y traer directorios, guarda el bloque de inicio para luego liberar memoria 
    if ((fd = open(DISC_PATH, O_RDONLY, 0)) == -1) { 
      printf("ERROR"); 
      return -ENOENT; 
    } 
    node = (void*) mmap(NULL, HEADER_SIZE_B + BITMAP_SIZE_B + NODE_TABLE_SIZE_B , PROT_READ, MAP_SHARED, fd, 0); 
    inicio = node; 
    node = &(node[GFILEBYBLOCK + BITMAP_BLOCK_SIZE]); 

    // Busca el nodo sobre el cual se encuentre el nombre. 
    node_name = &(node->fname[0]); 
    for (i = 0; ((node->parent_dir_block != nodo_anterior) | (strcmp(nombre, (char*) node_name) != 0) | (node->state == 0)) & (i < GFILEBYTABLE) ; i++){ 
      node = &(node[1]); 
      node_name = &(node->fname[0]); 
    } 

    // Cierra conexiones y libera memoria. 
    free(start); 
    free(start_super_path); 
    if (munmap(inicio, HEADER_SIZE_B + BITMAP_SIZE_B + NODE_TABLE_SIZE_B) == -1) printf("ERROR"); 
    close(fd); 
    if (i >= GFILEBYTABLE) return -1; 
    return (i+1); 
} 

當我調用這個函數的問題發生:

determinar_nodo("/Otra Carpetita/Inside Otra/Inside Otra Otra :D/"); 

有代碼中有許多冗餘步驟是因爲debbuging,只是嘗試將它們放在一邊。

對我來說真正重要的是內存問題。請注意,在聲明的開始處,我創建start和start_super_path指針,而不是在函數末尾釋放地址以釋放它。 此外,它似乎是函數在第二次調用時會中斷。這意味着第一個「免費」正常工作,這對應於determinar_nodo("/Otra Carpetita/")的呼叫,但它在免費呼叫determinar_nodo("/Otra Carpetita/Inside Otra/")處中斷。

在內存瀏覽器上出現debbuging,我可以注意到該函數試圖釋放的地址確實是正確的,所以我真的不知道會發生什麼。無論如何,如果我釋放任何這些,我得到了提到的錯誤。

在此先感謝您的幫助,並請原諒我可憐的英語。

+2

這就是爲什麼你應該總是用英文寫你的源代碼... – Lundin

回答