C++ 删除还是虚拟删除?

C++ 删除还是虚拟删除?,c++,virtual,C++,Virtual,我正在写一个lib和一个演示项目。该项目不关心我使用哪个版本的库(我可以使用sdl、directx或我喜欢的任何东西作为gfx后端)。为了得到我想要的东西 Obj *obj = libname_newDevice(); 现在,我应该使用delete还是执行obj->deleteMe()?我问是因为我不是在做新的,所以我不应该做删除 我有obj->create(类型)返回一个带有Obj接口的类。 我真正的问题是我是否需要libname\u deleteDevice()或者obj->deleteM

我正在写一个lib和一个演示项目。该项目不关心我使用哪个版本的库(我可以使用sdl、directx或我喜欢的任何东西作为gfx后端)。为了得到我想要的东西

Obj *obj = libname_newDevice();
现在,我应该使用delete还是执行
obj->deleteMe()?我问是因为我不是在做新的,所以我不应该做删除

我有
obj->create(类型)返回一个带有Obj接口的类。

我真正的问题是我是否需要
libname\u deleteDevice()
或者
obj->deleteMe()
好吗,因为我在界面中有一个deleteMe?

既然你在
libname\u newDevice()
中抽象创建内容(我不得不说这不是一个好方法),你应该使用类似
libname\u destroyDevice(obj)
的东西来销毁


正如Martin的评论所建议的那样,最好将它们放在自定义类的构造函数和析构函数中,您只需要在堆栈上创建它们,编译器将处理其余部分。

请尝试澄清您的问题。我完全不清楚

  • 为什么要提到图形化后端?这与问题有关吗
  • 您是在问应该如何设计库还是应该如何使用库
最好使用对象工厂来创建对象。我假设这是
libname\u newDevice()
的角色

库还应该提供删除对象的方法(例如
obj->DeleteMe()
libname\u delete(obj)


不要依赖C++的
delete
:调用方和库可能使用不同版本的编译器编译,这将在内存和资源分配方面做不同的事情。因此,如果lib删除它创建的对象,那么会更安全。

您肯定不想实现Obj::deleteMe()。它必须做一些类似的事情:

delete this;

当你还在里面的时候->删除我()。按照乱穿马路者的建议,让destroy函数以Obj*作为参数。

我认为最好的方法是尊重并拥有一些引用计数包装器对象(您甚至可以与自定义deallocator一起使用)。

我会更进一步。
如果使用工厂函数创建,则使用工厂函数销毁可能是合乎逻辑的。除此之外,它还可以使所有内容都很好,并安全地包装在一个对象中

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.

I gues图形与此无关。具体来说,我想知道是应该执行libname_Delete()还是应该执行obj->DeleteMe();我还有一个obj->create(类型);如果lib删除它创建的对象,则(在Windows中)更安全。但你的推理是有缺陷的。是的,对称性很好。然后,您应该将整个过程封装在一个对象中,在该对象中,构造函数/析构函数调用这两个函数。“删除此项;”可能会让人感到皮肤爬行,但不一定是坏的。实现自身引用计数的对象始终必须这样做。例如,请参见每个“我的第一个COM实现”中的Release()。