Come gestire la memoria nell'interfaccia C per l'implementazione di C ++ considerando il c ++ 11?

4

Ho una libreria implementata in C ++ che ha un'interfaccia C. Questa interfaccia C è, a tutti gli effetti, l'unico modo per usare questa libreria. C ++ 11 sembra scoraggiare l'uso di puntatori raw ma né shared_ptr o unique_ptr sono adatti in questo caso. Da quello che ho capito, intrusive_ptr è un'opzione, ma sono entrambi insicuro di come questo differisce dal mantenere il mio conteggio ref (sono nuovo di C ++) e diffido di wading in boost ancora (sono nuovo di C ++).

Come dovrei gestire la gestione della memoria in C ++ 11 e versioni successive? Dichiaro solo le specifiche per chiarire che sono disposto a utilizzare le funzionalità delle specifiche più recenti e che non è necessario mantenere la compatibilità con le specifiche precedenti.

    
posta griotspeak 19.04.2014 - 06:01
fonte

2 risposte

2

Il fatto che C ++ 11 offra una gamma di classi di puntatori intelligenti per semplificare la vita con la gestione della memoria non significa che non si possano o non si debbano usare i puntatori raw laddove ciò sia appropriato.

Il comitato che mantiene lo standard C ++ è molto riluttante a rimuovere le funzionalità esistenti dalla lingua e ancor più se si tratta di una funzionalità ampiamente utilizzata e utile come i puntatori grezzi. Mantenere la lingua compatibile all'indietro è una delle pietre angolari nella sua evoluzione.

Detto questo, se devi fornire un'interfaccia C-compatibile alla tua libreria C ++, dovresti utilizzare solo le funzionalità dal sottoinsieme comune di C e C ++ nell'interfaccia e ciò significa utilizzare i puntatori raw dove sono visibili nel interfaccia ed efficacemente lasciare che l'utente della tua libreria gestisca l'allocazione / deallocazione (sebbene tu possa fornire funzioni per questo).

    
risposta data 19.04.2014 - 08:31
fonte
1

Analisi.

Deve usare una sorta di puntatore intrusivo (in particolare il conteggio dei riferimenti implementato dall'utente), sebbene potrebbe essere Boost intrusive_ptr o qualche altro sapore.

La mia opinione personale.

Ho usato puntatori COM Microsoft nei miei progetti e funziona perfettamente. Se il tuo codice deve funzionare solo su Microsoft Windows, questo potrebbe essere il percorso consigliato in quanto il programmatore di sistemi C per Windows avrà probabilmente familiarità con esso. Per tutte le altre considerazioni, incluse le applicazioni multipiattaforma, usa% boost% co_de.

Ho descritto le mie opinioni sull'utilizzo minimo dei puntatori COM Microsoft in questa risposta .

La natura di intrusive_ptr.

È importante capire la natura di intrusive_ptr . È una classe handle, implementata usando template C ++. Viene fornito in modo che tali oggetti possano essere di proprietà dei chiamanti C ++.

Il codice C non può vedere questa classe di handle dalla loro intestazione include, lascia chiamarne i metodi. Invece, il codice C chiamerebbe alcuni metodi intrusive_ptr . Ciò significa che fornirai metodi di extern "C" che a loro volta chiamano i metodi extern "C" e intrusive_ptr_add_ref forniti da Boost intrusive_ptr_release .

link

Che cosa significa.

Chiamare i metodi C ++ su questo oggetto dal codice C richiederà una funzione wrapper per metodo di classe, come questo .

Per gli oggetti che richiedono intrusive_ptr e add_ref management, fornirai anche release delle funzioni wrapper per quelle.

È tua responsabilità documentare in modo ovvio, o comunicare al programmatore C, quali tipi di puntatore nel tuo oggetto vengono conteggiati con riferimento. Una combinazione di convenzione di denominazione, documentazione dell'API, utilizzo dell'API campione, e si consiglia l'avviso verbale.

Infine, comprendi le leggi (regole di proprietà degli oggetti) che devono essere rispettate quando si utilizza il conteggio dei riferimenti. Vedere questa domanda e la risposta .

Argomenti avanzati: cast di tipo oggetto o interfaccia, query di interfaccia, segregazione interfaccia

Ho usato queste tecniche solo con Microsoft COM (tramite il suo metodo extern "C" ), quindi non posso commentare se si possano usare queste tecniche su Boost QueryInterface quando si programma tramite un'interfaccia intrusive_ptr .

    
risposta data 19.04.2014 - 09:40
fonte

Leggi altre domande sui tag