C 样式对象删除的包装器

Posted

技术标签:

【中文标题】C 样式对象删除的包装器【英文标题】:wrapper for C-style object deletion 【发布时间】:2017-01-17 09:36:09 【问题描述】:

我最近开始学习 OpenGL(具体来说是 3.3 版),并且我还想为某些功能使用一些面向对象的设计。例如,我想创建一个名为 Shader 的类,它从文本文件中读取着色器、附加、分离它等。我遇到的问题是析构函数。我想所有的 OpenGL 对象或多或少都是这样工作的

glCreateShader()
// some code here
glDeleteShader()

假设我这样设计我的班级(这只是一个草图,所以没有任何细节)

class Shader

public:

    // read from file - not important right now
    Shader( )

    void delete()
     
        glDeleteShader();
        

    ~Shader()
    
        glDeleteShader();
    
 ;

我可以像这样创建我的对象并删除它

Shader x;
x.delete();

但这不会删除对象本身 - 只会释放 OpenGL 着色器的内存。最好有这样的东西

Shader x;
delete(x);

函数 delete() 从内存中删除所有内容(包括对象本身)。有可能吗,还是我应该只使用指针?

Shader* x = new Shader();
delete x;

我对任何 C 库都有同样的问题。

【问题讨论】:

您可以在这里找到答案:***.com/questions/17161013/… @Inline 我这样做只是为了更多地了解 C++ 栈上对象的析构函数一旦超出范围就会被自动调用,所以在这种情况下你不需要指针。除此之外,我建议在处理堆时使用smart pointers,一旦最后一个指针超出范围并释放伴随的内存,他们将调用析构函数。 @Bociek 这可能很有用***.com/questions/12089859/… 我制作了my own small wrapper in C++14,你可能会觉得很有趣。 【参考方案1】:

我可以像这样创建我的对象并删除它

Shader x;
x.delete();

首先,delete 是关键字,所以它可能不是函数名。

假设调用glDeleteShader 两次是可以的,这是可以的。但是对delete() 函数的调用是多余的,因为析构函数会自动处理对glDeleteShader 的调用。如果重复调用glDeleteShader 不行,那么调用delete() 不仅是多余的,而且是一个错误。

Shader x;
delete(x);

函数 delete() 从内存中删除所有内容(包括对象本身)。有没有可能……

无法通过调用函数从内存中删除具有自动存储持续时间的对象(除非您将存储替换为新对象,但这与此问题无关)。自动对象从内存中删除...自动当它们超出范围时。

还是应该只使用指针?

不,除非你需要。如果自动对象是一个选项,它们是更好的选择。只需这样做:

Shader x;
// glDeleteShader called when x is destroyed

【讨论】:

以上是关于C 样式对象删除的包装器的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会在 pytest-qt 中收到此“包装的 C/C++ 对象...已被删除”错误?

学习 Python:RuntimeError:StaticBitmap 类型的已包装 C/C++ 对象已被删除

NamedPipeServerStream/NamedPipeClientStream 包装器

为啥编译器在尝试使用 C++11 样式初始化对象数组时隐式删除​​构造函数

从零开始学习jQuery 使用jQuery操作元素的属性与样式

Java中包装器类的行为[重复]