删除还是虚拟删除?

时间:2008-11-12 16:42:37

标签: c++ virtual

我正在编写一个lib和一个演示项目。该项目并不关心我使用的lib版本(我可以使用sdl,directx或我喜欢的任何版本作为gfx后端)。获取我做的对象

Obj *obj = libname_newDevice();

现在,我应该使用删除还是应该obj->deleteMe();?我问,因为我不是在做新的,所以我不应该删除吗?

我有obj->create(theType);,它返回一个带有Obj接口的类。 我真正的问题是,我需要libname_deleteDevice();obj->deleteMe(),因为我在界面中有一个deleteMe吗?

5 个答案:

答案 0 :(得分:11)

由于你在libname_newDevice()内抽象创作(我不得不说这不是一个好方法),你应该使用像libname_destroyDevice (obj)这样的东西进行破坏。

正如Martin的评论所暗示的那样,最好将它们放在自定义类的构造函数和析构函数中,您只需要在堆栈上创建,编译器将负责其余的工作。

答案 1 :(得分:4)

请尝试澄清您的问题。这对我来说完全不清楚。

  • 为什么说到图形后端?这与问题有关吗?
  • 您是否在询问如何设计图书馆或如何使用图书馆?

最好有一个对象工厂来创建对象。我认为这是libname_newDevice()的作用。

图书馆还应提供删除对象的方法(例如obj->DeleteMe()libname_Delete(obj))。

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

答案 2 :(得分:3)

我会更进一步 如果使用工厂函数进行创建,则使用工厂函数进行销毁可能是合乎逻辑的。除此之外,还要使对象中的所有内容都安全可靠。

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.

答案 3 :(得分:1)

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

答案 4 :(得分:0)

你绝对不想实现Obj :: deleteMe()。它必须做类似的事情:

delete this;

当你还在这里时 - > deleteMe()。按照Jaywalker的建议,让destroy函数将Obj *作为参数。