Diciamo che ho questo struct
in ANSI C:ANSI C devi usare malloc() quando crei una struct?
typedef struct _point
{
float x;
float y;
} Point;
e questa funzione per creare questa struct
:
Point createpoint(float x, float y)
{
Point p;
p.x = x;
p.y = y;
return p;
}
Questo mi permette di creare un struct
con questa funzione vale a dire:
int main()
{
Point pointOne = createpoint(5, 6);
Point pointTwo = createpoint(10, 4);
float distance = calculatedistancefunc(pointOne, pointTwo);
/* ...other stuff */
return 0;
}
Qualcuno mi ha detto che questo codice non è valido, perché il struct
no ot ottenere malloc
'd nella funzione createpoint(float x, float y)
prima che venga restituito e che lo struct
venga eliminato. Tuttavia, quando uso il mio struct
in questo modo, non sembra essere cancellato.
Quindi la mia domanda è: devo malloc
questo struct
, e perché?/perchè no?
Qual è il tipo IMHO di mal consigliato. Se si desidera eseguire correttamente la gestione della memoria, non si dovrebbe tornare con un puntatore a una struttura allocata dinamicamente allocata nella propria funzione. Dovresti richiedere un puntatore preallocato in un terzo parametro e riempirlo con il tuo metodo. – mg30rg
@ mg30rg Perché dovresti passare un puntatore di struttura pre-allocata quando puoi farlo nella funzione e restituirlo? – Houssni
@YassineHoussni - Perché molto probabilmente leggerete il vostro codice più volte di quanto lo scriviate, quindi la leggibilità del codice è più importante della comodità di codifica. Se mantieni la memoria allocaton e release nello stesso blocco, sarà più difficile perdere memoria, perché le risorse sono riservate solo per il periodo esatto in cui sono necessarie e ogni resevation (es .: 'malloc()'/'getmem() '/' new') è visivamente associato a una disallocazione ('free()'/'freemem()'/'delete'). Puoi facilmente individuare un 'nuovo' senza' delete', ma vedrai un 'createpoint()' senza 'delete'? E farà il programmatore di manutenzione? – mg30rg