2016-05-16 44 views
6

Ho una domanda per le strutture C e i tipi di dati. Ho una struttura chiamata test:Quando verrà liberata memoria C della struttura

struct test 
{ 
    char* c; 
    char* c2; 
}; 

E Sto tornando questo struct da una funzione:

struct test a() 
{ 
    struct test t = { "yeah!", "string" }; 
    return t; 
} 

La mia domanda è se la memoria per la struct è liberato automaticamente o se devo fare questo manualmente tramite free().

[update from comment:]

La funzione a è in una DLL e voglio usare lo struct nel programma principale.

+0

Buon posto per capire i puntatori: http://cslibrary.stanford.edu/104/ – Chintan

+3

_automaticamente. Fatto. –

+0

cosa intendi per "liberato"? –

risposta

3

TL/DR Versione: Non è necessario manualmente free nulla; puoi trattare questa istanza di struct come tratterai qualsiasi variabile scalare. Versione

leggermente più lungo: L'istanza struct t trovi durata memorizzazione automatica, cioè la sua durata si estende per tutta la durata della funzione a; dopo le uscite a, viene rilasciata qualsiasi memoria allocata per t. A copia del contenuto di t viene restituito al chiamante.

Quanto a quei contenuti ...

c e c2 stanno indicando stringhe letterali; i valori letterali stringa vengono allocati in modo tale che la loro durata si estenda sull'intera esecuzione del programma. Quindi i valori del puntatore in c e c2 saranno validi dopo che t viene restituito da a; in effetti, quei valori del puntatore saranno validi per tutta la durata del programma.

Si dovrebbe avere solo per chiamare free su qualcosa che è stato assegnato tramite malloc, calloc o realloc.

5

Si dovrebbe solo free qualcosa che si malloc (o utilizzato un'altra funzione simile) prima. Dal momento che nulla era malloc ed, niente dovrebbe essere free d.

+1

Ma per quanto tempo posso usare la struttura allora? La funzione 'a' è in una DLL e voglio usare la struct nel programma principale. Come fa il compilatore a sapere quando cancellare la struct? –

+0

Il compilatore utilizza memcopy per copiare struct quando si restituisce t ' Purtroppo la DLL sta facendo un lavoro terribile usando string letterali (" yeah! "," String ") per restituire i dati. Il tempo di vita di questi è solitamente fintanto che la DLL è in memoria sulla maggior parte dei sistemi, quindi la memoria restituita è in gran parte inutilizzabile. La soluzione migliore è allocare su heap, eseguire una copia stringa e quindi restituire la struttura. Avere il chiamante fare il libero una volta che è fatto con la struttura. – Chintan

+0

@Chintan non esiste tale garanzia. Un valore di ritorno struct potrebbe anche essere nei registri o giù di lì. –

0

non è necessario liberare un'assegnazione non dinamica. Tuttavia, se vuoi usare la struct in un'altra funzione, devi passare l'indirizzo della struct e prenderla come una (struct *), se non lo fai, non sarai più in grado di usarla di nuovo.

+1

Non vero. Le strutture possono (e in questo caso sono) superate per valore. –

+0

Non lo nego. Quindi smetti di votare per niente, per favore. –

+1

La tua risposta contraddice chiaramente tale affermazione. –