0

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

Obj *obj = libname_newDevice();

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

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

4

5 回答 5

11

由于您正在抽象内部的创建libname_newDevice()(我不得不说这不是一个好方法),您应该使用类似libname_destroyDevice (obj).

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

于 2008-11-12T16:45:37.180 回答
4

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

  • 为什么说图形后端?它与问题有关吗?
  • 你是在问你应该如何设计你的库或者你应该如何使用它?

使用对象工厂来创建对象是一种很好的做法。我假设这是 的角色libname_newDevice()

该库还应提供一种删除对象的方法(例如obj->DeleteMe()libname_Delete(obj))。

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

于 2008-11-12T16:52:34.827 回答
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.
于 2008-11-12T17:16:22.937 回答
1

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

于 2008-11-12T17:13:23.630 回答
0

你肯定不想实现 Obj::deleteMe()。它必须执行以下操作:

delete this;

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

于 2008-11-12T17:10:06.100 回答