Desidero un puntatore intelligente conteggiato senza riferimento che possa combinare alcuni degli aspetti utili di auto_ptr
e shared_ptr
. Penso che il C++ 0x unique_ptr
sia in definitiva ciò di cui ho bisogno, ma ho bisogno di qualcosa che verrà compilato su Visual Studio 2008 e Xcode (gcc 4.2).C'è un puntatore intelligente generale come auto_ptr e shared_ptr che non ha bisogno di C++ 0x?
La funzionalità ho bisogno è:
- Utilizzabile in metodi di fabbrica in modo che la proprietà viene trasferita sulla copia (come auto_ptr)
- Supporta
release()
(come auto_ptr) - Può essere utilizzato con dichiarazione anticipata (like shared_ptr)
Quindi, suppongo che sia davvero meglio auto_ptr
. C'è qualcosa che lo fa in boost o altrove (nota: non ho il tempo di girarmi intorno a Loki)? O dovrei semplicemente rotolare il mio?
EDIT: Ho appena letto di più su auto_ptr
- suona come si può utilizzarlo con le dichiarazioni previsionali, se ci si assicura che l'intestazione di classe è incluso in ogni file cpp che fa riferimento l'intestazione con la smart puntatore (ad es. vedi GotW). Qualcuno ha qualche consiglio o regola generale su questo?
EDIT2: La ragione per cui shared_ptr non è accettabile è perché ho bisogno di un metodo release() poiché sto riordinando un codice legacy introducendo i metodi factory, ma deve coesistere con un codice di proprietà del puntatore manuale. L'utilizzo di shared_ptr in tutta la codebase sarebbe fantastico, ma un compito enorme.
EDIT3: Alla fine, auto_ptr
è stato adeguato per il lavoro una volta che ho scoperto le stranezze dell'inclusione diretta. Sarebbe anche interessante provare a scrivere un deleter personalizzato per shared_ptr
per consentire la cancellazione opzionale del puntatore.
Questo è esattamente ciò che uso auto_ptr per. Fino a quando non ho iniziato a usare boost (o in situazioni in cui non posso usare boost). –
Dai un'occhiata a https://github.com/codenrun/auto_ptr_custom. Aggiunge un deleter personalizzato a un'interfaccia come auto_ptr. – fizzbuzz