Il problema
Ho questa struttura che voglio creare un "costruttore" per questo.
struct example {
int x, y, z; /* various members */
struct another *another; /* pointer to another structure */
}
I due diversi modi che conosco
- Uso di funzioni che creano ed eliminano strutture su heap
Posso creare strutture creando funzioni che le allocano sullo heap in questo modo:
/* create example */
struct example *example_new(int x, int y, int z) {
struct example *p = malloc(sizeof *p);
p->x = x;
p->y = y;
p->z = z;
p->another = another_new();
}
/* delete example */
void example_new(struct example *p) {
another_del(p->another);
free(p);
}
- Utilizzo di funzioni che inizializzano e liberano la memoria per la struttura tramite il puntatore
Oppure potrei initalizzare la struttura passando il puntatore alla funzione e avere l'utente responsabile dell'allocazione e deallocazione della memoria per esso.
/* initalize example */
void example_init(struct example *p, int x, int y, int z) {
assert(p);
p->x = x;
p->y = y;
p->z = z;
p->another = another_new();
}
/* free memory allocated for example */
void example_free(struct example *p) {
another_del(p->another);
}
I miei pensieri
Di solito preferisco il primo approccio quando creo strutture ricorsive (come Alberi e elenchi collegati ) ma uso il secondo approccio in tutti gli altri casi.
Ho provato a utilizzare il secondo approccio per una struttura ricorsiva e si è rivelato piuttosto complicato.
La domanda
Come scegli tra questi due modi? C'è un terzo modo per risolvere questo problema?