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.