Pregunta

Estoy escribiendo una lib y un proyecto de demostración. Al proyecto no le importa qué versión de la lib utilizo (puedo usar sdl, directx o lo que quiera como el backend gfx). Para obtener el objeto que hago

Obj *obj = libname_newDevice();

Ahora, ¿debo usar delete o debo hacer obj- > deleteMe (); ? Pregunto porque no estoy haciendo exactamente lo nuevo, así que no debería estar haciendo la eliminación.

Tengo obj- > create (theType); que devuelve una clase con la interfaz Obj. Mi pregunta real es si necesito un libname_deleteDevice (); o ¿está obj- > deleteMe () bien porque tengo un deleteMe en la interfaz?

¿Fue útil?

Solución

Daría un paso más allá.
Si está utilizando una función de fábrica para crear, puede ser lógico utilizar una función de fábrica para destruir. Además de esto para que todo sea agradable y la exención se envuelva de forma segura en un objeto.

class ObjWrap
{
    public:
        ObjWrap()
            :obj(libname_newDevice())
        {}
        ~ObjWrap()
        {    libname_deleteDevice(obj);}
    private:
        ObjWrap(ObjWrap const&);        // Dont copy
        void operator=(ObjWrap const&); // Dont copy
        Obj* obj;
}; // If you want to copy then you need to extra work on ref counting
   // This may need some form of smart pointer.

Otros consejos

Dado que está abstrayendo la creación dentro de libname_newDevice () (que debo decir que no es un buen enfoque), debe destruir usando algo como libname_destroyDevice (obj) .

Y como sugiere el comentario de Martin, es mejor ponerlos en el constructor y destructor de una clase personalizada, que solo necesita crear en la pila, y el compilador se encargará del resto.

Intenta aclarar tu pregunta. No me queda claro.

  • ¿Por qué hablas de un back-end gráfico? ¿Es relevante para la pregunta?
  • ¿Está preguntando cómo debe diseñar su biblioteca o cómo debe usarla?

Es una buena práctica tener una fábrica de objetos para crear el objeto. Supongo que esta es la función de libname_newDevice () .

La biblioteca también debe proporcionar una forma de eliminar el objeto (como obj- > DeleteMe () o libname_Delete (obj) ).

No confíe en delete de C ++: la persona que llama y la biblioteca podrían haberse compilado con una versión diferente del compilador, lo que haría diferentes cosas con respecto a la asignación de recursos y memoria. Por lo tanto, es más seguro si su lib elimina el objeto que creó.

Creo que la mejor manera sería honrar RAII y tener algún objeto contenedor de referencia. (incluso puede usar shared_ptr con un deallocator personalizado ).

Definitivamente no desea implementar Obj :: deleteMe (). Tendría que hacer algo como:

delete this;

mientras todavía estabas dentro de esto- > deleteMe (). Siga la sugerencia de Jaywalker y haga que la función de destrucción tome un Obj * como parámetro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top