Qual è l'obiettivo del puntatore con ambito? per quanto ne so, il puntatore scoped gestisce la memoria all'interno di un blocco di codice. Se voglio dichiarare una variabile all'interno di un blocco, posso semplicemente dichiararlo su una pila e non preoccuparmi della pulizia.Perché i puntatori con scope in boost
risposta
Il punto è che è possibile creare e pulire un puntatore all'interno di un determinato ambito lessicale. Questo può essere utile in una varietà di situazioni e assicura che non ci siano perdite di memoria, dimenticando lo delete
se si utilizza esplicitamente new
, il che non è raccomandato.
si dovrebbe tenere a mente che il boost::scoped_ptr
è non copiabile, e quindi possiede è risorsa del tutto, per tutta la durata della sua vita. Ciò inoltre rende più sicuro lo boost::shared_ptr
, in quanto evita di copiare la risorsa o di condividerla accidentalmente.
{ //Some Scope
boost::scoped_ptr<int> i_ptr;
// do something with pointer
} // leave scope, pointer is cleaned up
Non se di dimensione o tipo dinamico. Inoltre, i puntatori con scope possono essere scambiati, e in C++ 11 unique_ptr
possono essere spostati, quindi non sono strettamente ad ambito.
Solo che "La ragione principale per usare 'scoped_ptr' piuttosto che' auto_ptr' è far sapere ai lettori del tuo codice che intendi "l'acquisizione delle risorse è inizializzata" da applicare solo per l'ambito corrente e non hai intenzione di trasferire la proprietà "... sembra come scambiare 'non è un uso previsto. –
@BenVoigt: ma è fornito e può essere utilizzato. – Puppy
Ecco [un vecchio thread] (http://lists.boost.org/Archives/boost/2002/09/36359.php) che spiega perché "swap" è diventato un requisito (in pratica si può usare "scoped_ptr" come membro di una classe copiabile). –
in genere gli stack di thread hanno limiti di memoria (vedere thread stacksize).
anche a volte il puntatore potrebbe essere stato passato dall'esterno e deve essere eliminato in questo ambito (ad esempio se viene lanciata un'eccezione, qualsiasi chiamata di cancellazione al di sotto di quella linea non verrà eseguita). Quindi è necessario in qualche modo di auto-magicamente ripulire il puntatore
void foo(Object*obj)
{
//this will ensure that object gets cleaned up even if doFoo() throws an exception
boost::scoped_ptr<Object> objCleaner(obj);
obj->doFoo();
}
Posso dichiarare il puntatore in pila e verrebbe automaticamente ripulito quando la funzione uscisse dall'ambito, con successo o tramite eccezione. Corretta? – Jimm
{X * x = & someObj; } questo non farà sì che il puntatore x venga cancellato quando esce dal campo di applicazione. someObj verrà eliminato quando esce dall'ambito. {X * y = new X();} questo tipo di codice richiede scope ptr per la pulizia automatica – mohaps
A differenza dei dati basati sullo stack, scoped_ptr ha un membro di reset() - in altre parole, è possibile costruire/destruct al contenuto del vostro cuore. Con questo, è possibile utilizzare un puntatore nullo (tecnicamente operator unspecified-bool-type
) come un indicatore che indica se esiste o meno un oggetto costruito in un dato momento. Permette anche di sequenziare costruzione/distruzione indipendentemente dall'ambito della variabile se necessario.
Inoltre, si consideri che è possibile dichiarare scoped_ptr come membro della classe, non solo come variabile di stack. Il docs suggerisce di utilizzare scoped_ptr per implementare l'handle/linguaggio del corpo (per nascondere i dettagli dell'implementazione della classe).
infine, di approfondire il punto di DeadMG "No, se è di tipo dinamico", è possibile utilizzare scoped_ptr per implementare un'operazione polymorphic:
{
scoped_ptr<Base> a(mode ? new DerivedA : new DerivedB);
a->polymorphic_function();
}
Non è davvero possibile fare questo con semplice stack- allocazione basata
vedi anche qui: C++0x unique_ptr replaces scoped_ptr taking ownership?
- 1. C++: puntatori e scope
- 2. Problemi con i puntatori e i puntatori ai puntatori
- 3. Puntatori intelligenti OpenCV o Boost
- 4. Problemi con i puntatori C
- 5. Cosa sono i puntatori potenti e i puntatori deboli
- 6. utilizzo const con i puntatori in C
- 7. A cosa servono i puntatori ai puntatori?
- 8. Problema con i puntatori di funzione in C++
- 9. Puntatori void per strutturare i puntatori in C
- 10. Informazioni su const_iterator con i puntatori?
- 11. Come gestire una mappa con i puntatori?
- 12. Buone analogie con i puntatori a funzione?
- 13. Come serializzare i puntatori condivisi/deboli?
- 14. Come posso restituire un blocco con scope?
- 15. Che cos'è Filter Scope e perché i nomi strani?
- 16. I puntatori sono cattivi?
- 17. Come includere solo i codici puntatori intelligenti BOOST in un progetto?
- 18. Utilizzo della memoria con i puntatori
- 19. Puntatori per iniziare con i moduli SilverStripe
- 20. Perché i metodi di ruby non hanno scope lessicale?
- 21. Prevenire i puntatori locali
- 22. destroy scope/child scope on scope destroy
- 23. Valori $ scope in AngularJS
- 24. Perché il controller angolare necessita di "$ scope"
- 25. Perché i puntatori deboli non possono accedere al puntatore sottostante?
- 26. Tempo per eliminare i puntatori
- 27. Che significato hanno questi volatili con i puntatori in C?
- 28. Come funzionano i puntatori ai puntatori e l'operatore di indirizzo?
- 29. transazione Scope con Entity
- 30. Accettare i doppi negativi con boost :: program_options
http://www.boost.org/doc/libs/1_36_0/libs/smart_ptr/scoped_ptr.htm#Handle/Body –