C ++ utilizzando shared_ptr con API [chiuso]

3

Sto costruendo una libreria che genera un paio di tipi di oggetti che possono essere usati dal codice utente e dalla libreria. Per tenere traccia di questi oggetti, mi piacerebbe usare shared_ptr's, così posso creare un po 'di pulizia di run-time. Dal momento che questi sono consumati dal codice utente, ero curioso di sapere se valesse la pena di digitare il tipo shared_ptr per semplificare il codice utente. Pertanto, anziché std::shared_ptr<Foo> , il codice utente potrebbe utilizzare FooPtr o qualcosa del genere.

Sarebbe una cosa ragionevole da fare, o il rischio di un codice poco chiaro è eccessivo?

    
posta dawsonc623 09.07.2015 - 15:51
fonte

2 risposte

4

Uno dei vantaggi dei puntatori intelligenti C ++ è che i loro nomi documentano le informazioni semantiche sulla proprietà e le informazioni sulla gestione della memoria.

Ad esempio:
Un std::shared_ptr<Foo> indica chiaramente che questa istanza di Foo è destinata all'utilizzo condiviso.

Analogamente, std::unique_ptr<Foo> indica chiaramente che questa istanza è di proprietà esclusiva ed esiste solo per la durata del unique_ptr .

Nascondendo il tipo di puntatore che stai usando dietro un typedef come FooPtr, stai nascondendo quella informazione dai tuoi utenti.

In definitiva, direi che in questo caso nascondere le informazioni non è auspicabile perché ora i vostri utenti non possono essere sicuri di chi sia responsabile della distruzione di FooPtr senza fare riferimento a un commento o altra documentazione fornita sull'uso di FooPtr.

Invece, lasciandolo come std::shared_ptr<Foo> o std::unique_ptr<Foo> chiarisce che la gestione della memoria per Foo è gestita dall'oggetto ptr stesso.

    
risposta data 09.07.2015 - 17:04
fonte
2

Con C ++ è meglio se esiste una documentazione esplicita su chi possiede il puntatore ed è responsabile della pulizia. shared_ptr tende a confonderlo ed è possibile che un ciclo di proprietà shared_ptr emerga attraverso l'utente e l'API che può portare a perdite.

Consenti all'utente di mantenere una piccola sezione di oggetti di unique_ptr e lasciare che altri oggetti siano posseduti (e ripuliti) da essi e referenziati dall'utente con puntatori o riferimenti grezzi.

    
risposta data 09.07.2015 - 16:03
fonte

Leggi altre domande sui tag