Domanda

Possibile duplicato:
Puntatori intelligenti/gestione sicura della memoria per C?

Ho un'applicazione incorporata in cui alloco un oggetto nella memoria dinamica e lo passo ad altri moduli.

Vorrei creare un puntatore intelligente a questo oggetto.Esistono molti esempi in C++ per l'utilizzo e l'implementazione dei puntatori intelligenti.

Sto cercando un'implementazione solo in linguaggio C di un puntatore intelligente.

Grazie.

È stato utile?

Soluzione

Sì, penso che sia impossibile (o almeno, non come utile) a causa di quello che dice @KennyTM. puntatori intelligenti sono possibili a causa di costruttori e distruttori di essere chiamato automaticamente. In caso contrario, si dovrà di riferimento call () e unreference () da soli. Ancora utile?

Inoltre, si veda questo precedente, molto relativa domanda SO: puntatori intelligenti / sicura gestione della memoria per il C?

Altri suggerimenti

Si può costruire un tipo "opaco" che è completamente incapsulato e fare quello che vuoi in più o meno come si farebbe in C ++.

Ti piace questa.

smartpointer.h:

typedef struct sp smartpointer;

smartpointer new(void *content, size_t s);
int          delete(smartpointer p)
void*        dereference(smartpointer p);
/* ... */

smartpointer.c

/* contains the definition of "struct sp" and the implementation of the 
   the functions */

e poi te la promessa di mai, mai, mai accedere ai dati, tranne usando dereference, ma naturalmente il compilatore non valere per voi.

Quindi, è tutto un sacco di problemi, e si dovrebbe riflettere molto attentamente su quello che si potrebbe ottenere.

Tendo a pensare che i puntatori intelligenti facciano (almeno) 2 cose per te:

  • gestione automatica tutta la vita (allocazione delle risorse) della memoria/oggetto
  • gestione automatica proprietà dell'oggetto (copia semantica, ecc.)

Il 2° aspetto può essere approssimativo implementando un'API potente che non consente alle persone di copiare/assegnare direttamente i puntatori.

Ma il primo elemento è dove il C++ e il suo supporto linguistico per costruttori/distruttori (il cuore di RAII) brillano davvero.È il fatto che costruttori e distruttori vengono chiamati, tramite il codice inserito automaticamente dal compilatore, nei posti giusti, che fanno funzionare la magia.Senza il supporto linguistico integrato per CTOR e DTOR, ti limiterai ad approssimare l'effetto o fare affidamento sul fatto che l'utente "faccia la cosa giusta" quando necessario.

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