首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除还是虚拟删除?

删除还是虚拟删除?
EN

Stack Overflow用户
提问于 2008-11-12 16:42:37
回答 5查看 1K关注 0票数 0

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

代码语言:javascript
复制
Obj *obj = libname_newDevice();

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

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-11-12 17:16:23

我会更进一步。

如果您使用工厂函数来创建,那么使用工厂函数来销毁可能是合乎逻辑的。除此之外,为了让一切变得美好和安全,将其封装在一个对象中。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2008-11-12 16:45:37

由于您正在抽象libname_newDevice()中的创建(我不得不说这不是一个好方法),您应该使用libname_destroyDevice (obj)之类的东西来销毁它。

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

票数 11
EN

Stack Overflow用户

发布于 2008-11-12 16:52:35

请试着澄清你的问题。这对我来说是完全不清楚的。

  • 为什么要提到图形化后端?它是否与问题相关?
  • 您是否在询问应该如何设计库或如何使用库?

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

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/284556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档