我正在写一个lib和一个演示项目。该项目并不关心我使用哪个版本的库(我可以使用sdl、directx或任何我喜欢的作为gfx后端)。来获取我所做的对象
Obj *obj = libname_newDevice();现在,我应该使用delete还是应该使用obj->deleteMe();?我问,因为我不是在做新的,所以我不应该做删除?
我有一个obj->create(theType);,它返回一个带有Obj接口的类。我真正的问题是,我需要一个libname_deleteDevice();,还是obj->deleteMe()可以,因为我在界面中有一个deleteMe?
发布于 2008-11-12 17:16:23
我会更进一步。
如果您使用工厂函数来创建,那么使用工厂函数来销毁可能是合乎逻辑的。除此之外,为了让一切变得美好和安全,将其封装在一个对象中。
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-12 16:45:37
由于您正在抽象libname_newDevice()中的创建(我不得不说这不是一个好方法),您应该使用libname_destroyDevice (obj)之类的东西来销毁它。
正如Martin的评论所建议的,最好将它们放在自定义类的构造函数和析构函数中,您只需在堆栈上创建这些类,编译器将负责其余的工作。
发布于 2008-11-12 16:52:35
请试着澄清你的问题。这对我来说是完全不清楚的。
使用对象工厂来创建对象是一种很好的实践。我假设这就是libname_newDevice()的角色。
该库还应该提供一种删除对象(如obj->DeleteMe()或libname_Delete(obj) )的方法。
不要依赖C++的delete:调用者和库可能是用不同版本的编译器编译的,这将在内存和资源分配方面做不同的事情。因此,如果你的库删除它创建的对象会更安全。
https://stackoverflow.com/questions/284556
复制相似问题