Implementazione di Smart Pointer in C [duplicato]
-
26-09-2019 - |
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.
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.