Domanda

Uso molto boost :: scoped_ptr nel mio codice ed è fantastico, ma attualmente sto lavorando con un software che utilizza shared_ptr ovunque e mi chiedo se mi manca qualcosa.

AFAIK a shared_ptr è utile solo se diversi thread accederanno agli stessi dati e non sai in quale ordine finiranno i thread (con shared_ptr assicurando che l'oggetto esista fino a quando l'ultimo thread non è terminato con esso).

Ci sono altri casi d'uso?

È stato utile?

Soluzione

I thread non sono rilevanti qui. Ciò che è rilevante è se è facile specificare un punto in cui l'oggetto non è più utile.

Supponiamo che diversi oggetti diversi vogliano usare lo stesso oggetto. Potrebbe essere un pacchetto di dati, o per input / output, o qualche oggetto geometrico, o altro. Si desidera eliminare l'oggetto condiviso dopo aver eliminato tutti gli oggetti che utilizzano e non un ciclo di clock prima. Invece di capire quale oggetto proprietario avrà la durata più lunga (e che può cambiare se cambi il programma, o forse attraverso l'interazione dell'utente), puoi usare shared_ptr per forzare questo comportamento.

Non importa se gli oggetti che usano si trovano nello stesso thread o in thread diversi. Gli oggetti possono avere una durata imprevedibile anche se sono tutti nello stesso thread.

Altri suggerimenti

  

AFAIK a shared_ptr è utile solo se   fili diversi saranno   accedere agli stessi dati

Bene, è per le situazioni in cui più proprietari possiedono lo stesso oggetto a cui punta il puntatore intelligente. Possono accedere ai puntatori intelligenti da thread diversi e shared_ptr è utilizzabile anche in quell'area, ma non è questo il punto principale. Se l'ultimo proprietario perde il riferimento all'oggetto puntato, il meccanismo shared_ptr elimina l'oggetto.

Puoi utilizzare un scoped_ptr se tutto quello che vuoi avere è un puntatore che viene eliminato quando l'ambito in cui viene creato viene lasciato (o per eccezioni, da un goto verso un luogo esterno, o tramite un normale flusso di controllo o qualche altro meccanismo). Se lo usi in questo modo, non è necessario cambiare in shared_ptr.

La differenza tra scoped_ptr e shared_ptr (e auto_ptr) è principalmente la semantica della copia.

  • scoped_ptr è per " Allocazione delle risorse è inizializzazione " e non è copiabile (non può essere condiviso con altre istanze e la proprietà non può essere trasferita)
  • shared_ptr è per il recupero automatico della memoria quando condivisa tra più parti
  • auto_ptr è copiabile (e trasferisce la proprietà quando assegnato)

Un'altra importante differenza tra shared_ptr e scoped_ptr è che solo shared_ptr funziona con weak_ptr. I puntatori deboli vengono utilizzati per interrompere i cicli di puntatori condivisi, evitando in tal modo perdite di memoria, ma debole_ptr può essere utilizzato per altro.

Puntatori condivisi e deboli possono essere usati per esprimere la differenza tra riferimenti proprietari e non proprietari. La proprietà inequivocabile dei dati porta a un design più pulito, quindi quando possibile gli oggetti dati dovrebbero essere di proprietà di uno un altro oggetto tramite shared_ptr. Tutti gli altri riferimenti a lunga durata agli oggetti dati devono essere puntatori deboli, che esprimono la loro non proprietà dei dati. Ogni volta che tutti i moduli non proprietari accedono ai dati, devono convertire il punto debole in un punto condiviso, a quel punto possono scoprire che l'oggetto dati non esiste più. Tuttavia, mentre i moduli non proprietari accedono all'oggetto dati, lo trattengono attraverso transient shared_ptr, garantendo un funzionamento sicuro anche se l'oggetto proprietario dovesse rilasciare i dati.

Come già risposto, shared_ptr riguarda la proprietà condivisa. Tuttavia, direi che la proprietà condivisa è generalmente una cosa negativa (esistono eccezioni, come il modello flyweight) ed è meglio identificare un proprietario e inserirvi un ambito_ptr.

Un shared_ptr è un tipo di puntatore intelligente che fa riferimento al conteggio. Se esiste un solo proprietario per l'oggetto (caso frequente), scoped_ptr è la soluzione giusta. Se l'oggetto può essere condiviso tra più parti del codice, shared_ptr non consentirà la distruzione dell'oggetto fino a quando tutti i riferimenti ad esso non saranno stati rilasciati.

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