Question

J'écris un projet de bibliothèque et de démonstration. Le projet ne se soucie pas de la version de la lib que j'utilise (je peux utiliser sdl, directx ou tout ce que j'aime comme backend gfx). Pour obtenir l'objet que je fais

Obj *obj = libname_newDevice();

Maintenant, devrais-je utiliser delete ou devrais-je faire obj- > deleteMe (); ? Je pose la question parce que je ne fais pas vraiment de nouveau, alors je ne devrais pas faire de suppression?

J'ai obj- > create (theType); qui renvoie une classe avec l'interface Obj. Ma vraie question est la suivante: ai-je besoin d'un libname_deleteDevice (); ou bien obj- > deleteMe () puisque j'ai un deleteMe dans l'interface?

Était-ce utile?

La solution

Je ferais un pas de plus.
Si vous utilisez une fonction usine pour créer, il peut être logique d'utiliser une fonction usine pour détruire. En plus de cela, pour que tout soit agréable et sûr, vous envelopperez dans un objet.

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.

Autres conseils

Puisque vous abstenez la création dans libname_newDevice () (ce que je dois dire, ce n'est pas une bonne approche), vous devez détruire en utilisant quelque chose comme libname_destroyDevice (obj) .

Et comme le suggère le commentaire de Martin, il est préférable de les placer dans le constructeur et le destructeur d'une classe personnalisée, qu'il vous suffit de créer sur pile, et le compilateur se chargera du reste.

Essayez de clarifier votre question. C'est totalement incertain pour moi.

  • Pourquoi parlez-vous d'un back-end graphique? Est-ce pertinent pour la question?
  • Voulez-vous savoir comment concevoir votre bibliothèque ou comment l'utiliser?

Il est judicieux de disposer d’une fabrique d’objets pour créer cet objet. Je suppose que c'est le rôle de libname_newDevice () .

La bibliothèque doit également fournir un moyen de supprimer l'objet (tel que obj- > DeleteMe () ou libname_Delete (obj) ).

Ne vous fiez pas à delete du C ++: l'appelant et la bibliothèque pourraient avoir été compilés avec une version différente du compilateur, ce qui aurait des effets différents sur l'allocation de mémoire et de ressources. Il est donc plus sûr que votre bibliothèque supprime l'objet qu'elle a créé.

Je pense que le meilleur moyen serait d'honorer RAII et de disposer d'un objet wrapper de comptage de références (vous pouvez même utiliser shared_ptr avec un deallocator personnalisé ).

Vous ne voulez certainement pas implémenter Obj :: deleteMe (). Il devrait faire quelque chose comme:

delete this;

alors que vous étiez encore à l'intérieur de cette- > deleteMe (). Suivez la suggestion de Jaywalker et faites en sorte que la fonction destroy prenne un objet * comme paramètre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top