He escrito un contenedor de C ++ extensible alrededor de una biblioteca c muy difícil de usar pero también muy útil. El objetivo es tener la conveniencia de c ++ para asignar el objeto, exponer sus propiedades, desasignar el objeto, copiar semántica, etc.
El problema es este: a veces la biblioteca c quiere el objeto subyacente (un puntero al objeto), y el destructor de clase no debe destruir la memoria subyacente. Si bien la mayoría de las veces, el destructor debe desasignar el objeto subyacente. He experimentado con la configuración de un bool hasOwnership
indicador en la clase para que el destructor, el operador de asignación, etc. sepan si debe o no liberar la memoria subyacente. Sin embargo, esto es engorroso para el usuario y, a veces, no hay forma de saber cuándo otro proceso usará esa memoria.
Actualmente, lo tengo configurado donde cuando la asignación proviene de un puntero del mismo tipo que el tipo subyacente, entonces configuro el indicador hasOwnership. Hago lo mismo cuando se llama al constructor sobrecargado usando el puntero de la biblioteca c. Sin embargo, esto todavía no maneja el caso cuando el usuario ha creado el objeto y lo ha pasado a una de mis funciones que llama a c_api y la biblioteca almacena el puntero para su uso posterior. Si eliminaran su objeto, sin duda causaría un defecto en la biblioteca c.
¿Existe un patrón de diseño que simplifique este proceso? ¿Quizás algún tipo de recuento de referencias?
unique_ptr
en la mayoría de los casos, ya puede manejar este tipo de recursos, por lo que no necesita implementar la administración de recursos usted mismo. unique_ptr
utiliza el release
método para renunciar a la propiedad del objeto almacenado.