Me preguntaba si hay una forma de usar unique_ptr<T>
con Windows HANDLEs?¿Cómo utilizar los punteros inteligentes estándar de C++ con Windows HANDLEs?
Estaba pensando en reemplazar el std::default_delete
con handle_trats
que llama al CloseHandle
. El problema es que HANDLE
se define como void*
unique_ptr<void>
no se compilará ya que sizeof(void)
no está definido.
Hasta ahora sólo veo dos posibilidades:
- crear una clase contenedora para las manijas y utilizar de esta manera:
unique_ptr<new CHandle(h)>
. Esto hace que elunique_ptr<T>
sea inútil. - Utilice
HANDLE
clase específica de puntero inteligente que se asemeje aunique_ptr<T>
.
¿Cuál cree que es la mejor opción? ¿Qué sugieres?
La pregunta se puede ampliar para COM IUnknown
punteros - ¿puede reemplazarse CComPtr
por alguno de los punteros inteligentes estándar?
Escribí mis propias clases específicas de HANDLE, ya que algunas manecillas requieren 'CloseHandle()' mientras que otras requieren diferentes funciones específicas de API, algunas HANDLEs se configuran en INVALID_HANDLE_VALUE cuando no están asignadas y otras en NULL, etc. Escribí un conjunto de clases base para la mayor parte del trabajo, y luego uso clases de características personalizadas para manejar problemas de cierre y asignación. –
-1 para volver a implementar mal las clases de biblioteca. Están explícitamente diseñados para esta funcionalidad, no es un abuso. Introducirá nuevos códigos y errores inútiles. – Puppy
+1 para reconocer que los punteros y los MANIPULADORES son cosas diferentes con semántica diferente. Shoehorning HANDLEs en un tipo de puntero inteligente le ofrece un conjunto de métodos que realmente no tienen sentido para HANDLEs. –