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 样式初始化对象数组时隐式删除构造函数