[C] rilascio risorse di una struttra ad albero n-ario

di il
3 risposte

[C] rilascio risorse di una struttra ad albero n-ario

Ammetto che è un cross-posting, dato che sul forum di programmazione di ubuntu, mi hanno risposto in modo molto superficiale e penso addirittura sbagliato.
La mia struttura è la seguente:

=== Struct ===

    struct directory{
        char* path;
        long size;
        struct directory** subDir;
        int num_subdir;
        struct file_info** files;
        int num_files;

    };


    struct file_info{
        char* path;
        long size;
        char* rights;
        double timestamp;
    };

    typedef struct directory Directory;
    typedef struct file_info FileInfo;

In questo modo alloco:
=== Allocazione ===

bool addSubDir(Directory* parent, Directory* subDir)
{
    if(parent == NULL || subDir == NULL){ return false;}
    parent->num_subdir++;

    parent->subDir = (Directory**)realloc(parent->subDir, sizeof(Directory*)*(parent->num_subdir));

    *(parent->subDir + parent->num_subdir -1 ) = subDir;

    return true;
}

bool addFile(Directory* dir, FileInfo* file)
{
    if(dir == NULL || file == NULL) return false;
    dir->num_files++;

    dir->files = (FileInfo**)realloc(dir->files, sizeof(FileInfo*)*(dir->num_files));

    *(dir->files + dir->num_files -1) = file;

    return true;
}
Adesso ho creato una procedura per il rilascio delle risorse, sfruttando una visita post-ordine e arrivato alle foglie, man mano rilascio le risorse risalendo. Dove sbaglio? L'ho testata e non sembra darmi errori, ma rischio o no un memory leak?

=== Deallocazione ===

void freeDirectory(Directory* dir)
{
    free(dir->path);

    int i;
    for(i=0; i<dir->num_files; i++)
    {
        freeFileInfo(dir->files[i]);
    }

    free(dir->files);

    for(i=0; i<dir->num_subdir; i++)
    {
        freeDirectory(dir->subDir[i]);
    }

    if(dir->subDir == NULL) free(dir);

}
Grazie mille per qualsiasi consiglio e aiuto.

3 Risposte

  • Re: [C] rilascio risorse di una struttra ad albero n-ario

    Per spere se hai deallocato Tutto quello che hai allocato, c'e' un giochino semplice che puoi fare:

    1) devi tenere traccia di QUANTI blocchi di memoria hai allocato, quante malloc, calloc, mediante una variabile statica. Le realloc, ovviamente non contano, perche' semplicemente modificano la dimensione di un blocco gia' allocato
    2) devi tenere traccia di QUANTE free hai eseguito, mediante un'altra variabile, o decrementando la prima.

    Alla fine devi avere ZERO.
    Se >0 ti sei dimenticato qualcosa
    Se <0 hai deallocato troppo, piu' volte la stessa cosa
  • Re: [C] rilascio risorse di una struttra ad albero n-ario

    In casi scolastici del genere, è comunque importante fare ricorso ad apposite librerie per l'integrity oppure in subordine a tools come Dr. Memory o Valgrind, a supporto delle best practices per l'uso di memoria dinamica in ambito didattico.
  • Re: [C] rilascio risorse di una struttra ad albero n-ario

    Grazie mille le proveró entrambe.
Devi accedere o registrarti per scrivere nel forum
3 risposte