我正在编写一个lib和一个演示项目。该项目并不关心我使用的lib版本(我可以使用sdl,directx或我喜欢的任何版本作为gfx后端)。获取我做的对象
Obj *obj = libname_newDevice();
现在,我应该使用删除还是应该obj->deleteMe();
?我问,因为我不是在做新的,所以我不应该删除吗?
我有obj->create(theType);
,它返回一个带有Obj接口的类。
我真正的问题是,我需要libname_deleteDevice();
或obj->deleteMe()
,因为我在界面中有一个deleteMe吗?
答案 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 *作为参数。