Domanda

Va ??bene farlo in c?

int *i;
// do stuff

i = NULL;

i = (int *) some_func();
// do stuff

if (i != NULL)
    free(i);

i = NULL;

// do stuff
i = (int *) some_func();
// do stuff
if (i != NULL)
    free(i);

i = NULL;
È stato utile?

Soluzione

1) Dipende dal contratto che hai con some_func (). Se some_func si aspetta che tu chiami free () sul suo valore di ritorno, il tuo codice è ok.

2) Va bene, anche se non terribilmente elegante, riutilizzare le variabili in C. È generalmente meglio usare variabili diverse per scopi diversi. Dal punto di vista delle prestazioni e dell'utilizzo dei mem è completamente la stessa cosa.

Altri suggerimenti

Dipende da cosa sta facendo some_func () . Se sta allocando memoria con malloc () , allora dovresti liberare () quando hai finito. In caso contrario, non dovresti. Fare riferimento alla documentazione della funzione per essere sicuri.

Secondo la risposta di Edgar, ma noto anche che il test per NULL qui non è necessario:

if (i != NULL)
    free(i);

perché libero (NULL) è consentito.

Il tuo codice sembra OK - di quale bit specifico stai chiedendo? Ma nota che se la funzione restituisce un int *, non è necessario un cast e, in caso contrario, probabilmente non dovresti assegnarlo a un int *.

Beh, l'unico problema che vedo è il problema della leggibilità non legato solo a C. Hai riutilizzato un nome di variabile così tante volte in un blocco che è davvero difficile scoprire a cosa servisse.

Se some_func restituisce un puntatore che punta a una memoria allocata dinamicamente, sì.

È OK fintanto che some_func () fa quello che dovrebbe fare. Se assegna un indirizzo non valido (non allocato) a i, causerà l'arresto anomalo del programma.

Dipende dal contratto di some_func ().

Se some_func () alloca un po 'di memoria e designa la tua responsabilità di rilasciarlo, allora sì va bene liberarlo (). In realtà, non è un bug.

Questo è uno dei bugbear di lavorare in un linguaggio non gestito, devi tenere traccia delle risorse che possiedi ed essere sicuro di rilasciarle.

Se some_func () " possiede " i suoi dati e restituisce solo puntatori ad esso per poterlo ispezionare, non dovresti liberarlo. Se malloc è solo per te, allora sei davvero responsabile di fare il free

Nel tuo primo passo

int *i;
// do stuff

i = NULL;

Se indicassi qualcosa che allocava memoria, quella memoria non andrebbe persa per sempre (perdita di memoria)?

Ad esempio:

int *i;
i = (int*) malloc(sizeof(int);
i = NULL;

lascerebbe un pezzo di memoria delle dimensioni di int lasciato fluttuare nell'etere.

Lo stesso vale per i tuoi esempi some_func (), ma penso che tu stia testando correttamente per tentare di liberare ciò che some_func () ha lasciato. Soprattutto se non sai come funziona some_func ().

Se some_func () proviene da una libreria, potrebbe esserci una funzione free_some_func (i) che farebbe il lavoro per te.

  

i = (int *) some_func ();

Non hai detto quale sia il tipo di ritorno di some_func () , ma la parte (int *) è un po 'sospetta. C è generalmente abbastanza indulgente su queste cose e di solito si compila in modo pulito senza la necessità di un cast esplicito. In caso contrario, considera attentamente se ciò che stai facendo è ben definito e portatile come vorresti che fosse.

@Kevin Montrose: Hmmm. Sì, richiedere ai programmatori di essere competenti è un vero affare. Forse dovremmo indossare tutti i caschi mentre imbracciamo il codice, nel caso in cui il soffitto cada. E qual è il "contratto" di some_func ? some_func restituisce un valore adatto per passare a libero, oppure no. Non esiste un "contratto" Là. Ma poi, sono una vecchia scoreggia e non credo nell'offuscamento per vincere punti brownie con il management. Questi sono concetti semplici.

@caf: probabilmente dipende dal compilatore / dalla libreria. È più sicuro controllare come sta facendo. Solo perché l'implementazione di controlli gratuiti per un puntatore NULL non significa che lo facciano tutti.

Se vuoi dire è OK riutilizzare il puntatore int invece di dichiararne uno nuovo ad ogni utilizzo, certo che è OK ma in generale può essere fonte di confusione se tutto il tuo // do stuff è composto di molto codice. Un altro programmatore potrebbe confondersi sulla provenienza di * i e sul perché significhi X qui e Y lì.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top