Mi chiedevo se esiste un modo per utilizzare unique_ptr<T>
con gli HANDLE di Windows?Come utilizzare puntatori intelligenti standard C++ con Windows HANDLE?
Stavo pensando di sostituire lo std::default_delete
con lo specifico che chiama CloseHandle
. Il problema è che HANDLE
è definito come void*
unique_ptr<void>
non verrà compilato come sizeof(void)
non è definito.
Finora vedo solo due possibilità:
- creare una classe wrapper per maniglie e usare in questo modo:
unique_ptr<new CHandle(h)>
. Questo rende praticamente lo stessounique_ptr<T>
inutile. - Utilizzare la classe di puntatore intelligente specifica
HANDLE
simile aunique_ptr<T>
.
Quale pensi sia la scelta migliore? Che cosa suggeriresti?
La domanda può essere esteso per COM IUnknown
puntatori - può CComPtr
essere sostituito da uno qualsiasi dei puntatori intelligenti standard?
Ho scritto il mio set di classi specifiche di HANDLE, poiché alcuni handle richiedono 'CloseHandle()' mentre altri richiedono diverse funzioni specifiche dell'API, alcuni HANDLE sono impostati su INVALID_HANDLE_VALUE quando non assegnati e altri sono impostati su NULL invece, ecc. Ho scritto un insieme di classi base per la maggior parte del lavoro, e poi uso classi di tratti personalizzati per gestire i problemi di chiusura e assegnazione. –
-1 per reimplementare male le classi di libreria. Sono espressamente progettati per questa funzionalità, non è un abuso. Introdurrai nuovi bug e codici inutili. – Puppy
+1 per riconoscere che i puntatori e gli HANDLE sono cose diverse con semantica diversa. Scaricando gli HANDLE in un tipo di puntatore intelligente si ottengono numerosi metodi che non hanno alcun senso per gli HANDLE. –