复制或移动对象时,C 中 OpenGL 对象的 RAII 如何导致意外行为?
Nov 29, 2024 pm 09:12 PMC 中 OpenGL 对象的 RAII :了解隐藏的问题
在 C 面向对象编程中,资源获取就是初始化(RAII)是用于有效管理资源的技术。在 C 类中使用 OpenGL 对象时,通常需要使用 RAII 来确保类销毁时正确释放 OpenGL 对象。
考虑以下代码片段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
这个类似乎为 OpenGL 对象正确实现了 RAII。但是,当复制或移动类时,就会出现问题,如以下代码所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
在这些情况下,OpenGL 对象将变得不可用,从而导致错误。
原因这种行为的原因在于编译器生成的默认复制构造函数和赋值运算符。这些操作只是复制对象的成员,从而导致多个 C 对象引用同一底层 OpenGL 对象。当原始 C 对象被销毁时,它会释放 OpenGL 对象,导致其他对象引用已销毁的资源。
要解决此问题,BufferObject 类应该是仅移动类型。这意味着消除复制构造函数和赋值运算符,并提供将 OpenGL 对象的所有权转移到新对象的移动等效项。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
通过这些更改,该类可确保 OpenGL 对象得到正确管理,并且释放,即使在复制或移动类时也是如此。
以上是复制或移动对象时,C 中 OpenGL 对象的 RAII 如何导致意外行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

热门文章

热门文章

热门文章标签

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)