2013-04-28 9 views
12

Mi chiedevo se è possibile verificare se un puntatore passato in una funzione è stato allocato da malloc/calloc/realloc?Posso controllare se un puntatore è stato allocato da malloc/calloc/realloc?

int main(){ 
    struct something o; 
    struct something *a; 
    a = malloc(sizeof(struct something)); 
    freeSome(&o);/*This would normally throw an (corruption?) error*/ 
    freeSome(a);/*This is fine*/ 
} 

void freeSome(struct something * t){ 
    if (/*expression here*/){ 
     free(t); 
    } 
} 

ho capito che di solito si controlla per vedere se t == NULL, ma mi stavo chiedendo se era possibile vedere se la memoria è stata assegnata per il puntatore data.

+2

No, non è possibile, ecco perché è necessario inizializzare un puntatore su NULL. –

risposta

7

No, non è possibile.

Fondamentalmente, non è necessario eseguire questa operazione. Se si desidera scrivere una funzione di supporto per liberare un po 'di memoria dato un puntatore, si dovrebbe univoco e in modo esplicito passare un puntatore assegnato in modo dinamico a una determinata area di memoria per farlo.

I puntatori grezzi in C non possono trasportare ulteriori informazioni sulla memoria a cui stanno puntando. Se si desidera avere tali informazioni, si dovrà passare un involucro aggiuntivo che contiene il puntatore siete interessati, come ad esempio:

typedef struct my_pointer 
{ 
    void *ptr; 
    int is_dynamically_allocated; 
} ptr; 

Ma questa sarebbe una perdita enorme della memoria/tempo.

+0

inoltre non specifica se questa memoria dinamica è di proprietà dell'utente o di qualcun altro. Mi chiedo se c'è un nome migliore per "un puntatore che è una risorsa specificamente posseduta da questo oggetto, in contrasto con un puntatore gestito da qualcun altro". – Dmitry

4

modo di controllare, si dovrebbe NULL inizializzazione e poi verificare se effettivamente NULL

Dalla sezione 7.20.3.2 La funzione libera di serie C99:

La funzione libera provoca lo spazio indicò da ptr per essere deallocato, ovvero, reso disponibile per ulteriore assegnazione. Se ptr è un puntatore nullo, non si verifica alcuna azione. Altrimenti, se l'argomento non corrisponde a un puntatore precedentemente restituito dalla funzione calloc, malloc o realloc o se lo spazio è stato deallocato da una chiamata a free o realloc, il comportamento non è definito.

Problemi correlati