glDeleteBuffers() 在析构函数调用期间崩溃

2024-01-10

正如 Qt 用户所知,使用任何 OpenGL 扩展都可能非常麻烦。我让它工作的方法是扩展 QGLFunctions 类,如下所示:

 class Object3D : protected QGLFunctions{ 
 ... 
 }

为了使 Object3D 能够正确运行,以便它可以调用 glGenBuffer() 等函数,需要调用

initializeGLFunctions(glWidget->context());

创建 QGLWidget 后,否则当应用程序使用任何扩展函数时,它只会使应用程序崩溃。虽然我最终可以在 Object3D 存在期间调用“glGenBuffer()”和其他函数,但它似乎在包含“glDeleteBuffer()”调用的 ~Object3D() 调用时崩溃。我确信正是该调用导致应用程序崩溃。

有人知道如何解决这个问题吗?我怀疑这是因为 QGLWidget 在 Object3D 之前先被删除,所以 QGLWidget 的上下文消失了。如果是这种情况,我怎样才能确保 QGLWidget 最后被删除,因为 QGLWidget 被添加到 QMainWindow 中,而 QMainWindow 只是按照添加顺序删除其子级?


一般规则是,如果你不能保证当上下文仍然存在时,OpenGL RAII 对象将被销毁,那么不要将 OpenGL 对象包装在 RAII C++ 类中。通过其他方式管理 OpenGL 对象的生命周期。

这是您的代码(您忘记向我们展示);只有您可以决定在何处或如何管理类的销毁。您需要一些系统来管理您的对象,以确保事物按正确的顺序销毁(和创建)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

glDeleteBuffers() 在析构函数调用期间崩溃 的相关文章

随机推荐

  • php,while()循环中的无限循环

    infinite loop x 1 while x 9 echo x x 我不明白背后的原因 为什么上面的代码会导致无限循环 在我看来 上面的代码应该输出 9 一次 但它输出无穷无尽的999999999 首先 当 x 等于 1 时 whil
  • Smack 的 FileTransferManager.createOutgoingFileTransfer 仅接受完整的 JID。如何在 Smack 中确定用户的完整 JID?

    经过几个小时的调试并试图找出为什么使用 aSmack 无法进行文件传输 而正常的消息传递却可以 我终于设法将其确定为这一点 当我按照 Smack 文档中给出的方法获取用户的名册列表时 Openfire 服务器发送的名册 JID 末尾缺少 C
  • 使用当前行值更新变量

    我正在尝试执行一项复杂的操作 其中我提取整列数据的总和 并从每行的总和中减去运行小计 我可以单独完成 Sum 和 Running Subtotal 的组成部分 用它来运行小计 sum UsageMetric over order by Ne
  • IE9、表格和显示:块

    对于我网站的低宽度移动版本 我切换了display某些的table tr td and th to block 让它们垂直堆叠 我使用此技术来允许宽表继续显示其所有内容 而不会溢出其容器之外 它在所有现代 5 种浏览器中都能完美运行 但在
  • 如何在 Android 中以最佳方式调整位图大小?

    假设我有一个六边形 如果我调整它的大小以在包含六边形网格的应用程序中使用它 bgPaint new Paint bgPaint setAntiAlias true bgPaint setDither true Bitmap coloredB
  • iOS - 如何使用 NIB 中的特定框架初始化自定义 UIView

    我想知道初始化自定义的最干净的方法是什么UIView具有特定的框架 The UIView是由一个设计的XIB file 这是我的实现 class CustomView UIView IBOutlet var outletLabel UILa
  • 为 Debian Lenny 编译 OpenCV 2.4.2

    为了保留问答方面 我在最新 v 2 4 2 OpenCV 版本中遇到了一个奇怪的问题 安装失败并出现以下错误 在 OpenCV 2 4 2 modules core src system cpp 460 包含的文件中 OpenCV 2 4
  • 如何告诉 CMake 在 Windows 上使用 Clang?

    我有一个使用 CMake 构建的 C 项目 我通常在 OSX 上构建 但现在我正在尝试让 Windows 版本也能工作 出于兼容性原因 我想在 Windows 上使用 Clang 我从 LLVM 安装了预编译的 Clang 3 8 二进制文
  • 为什么无法在组合框中选择空值?

    在 WPF 中 似乎不可能从组合框中选择 使用鼠标 空 值 Edit澄清一下 这是 NET 3 5 SP1 这是一些代码来说明我的意思 首先 C 声明 public class Foo public Bar Bar get set publ
  • 使用别名更改默认 python 版本

    我想知道是否使用alias在终端中更改默认的Python版本对脚本中Python的后续调用有积极的影响吗 例如 我使用 alias python python36 run program 现在假设 run program 是一个调用多个嵌套
  • Scala - 动态类加载 - A 类无法转换为 A 类

    我有一个包含类的简单 jar 文件A public class A 然后我在运行时加载它 var classLoader new URLClassLoader Array my jar file toURI toURL var clazz
  • 如何用另一个 CSS 覆盖 CSS 中定义的背景图像?

    我有一个 Core css 它定义了网站的页面背景图像以及主题 但对于特定页面 我只想更改背景 关于如何在单独的 CSS 文件中实现这一点有什么建议吗 该页面的 HTML 是 core css 定义 body background imag
  • 当 UIView 变得可见时,如何收到通知?

    每当 UIView 对用户可见时 即当 UIScrollview 是某些 UIView 的超级视图时 是否有一种方法可以获取通知 回调或其他方式来调用方法 并且此类 UIView 的 ViewController 应在以下情况下收到通知 它
  • 根据用户输入将单词中的字母加粗

    我的应用程序中有一个搜索组件 当用户输入一些文本时 它会根据用户输入过滤数据并显示过滤数据的列表 我想要做的是将用户搜索的文本在过滤后的数据中加粗 例如 如果我搜索 Jo 过滤后的数据应显示为John Joseph Joe Rogan 我可
  • 爆炸函数后将值添加到一个数组

    我正在尝试从所有行获取所有路径并将它们 爆炸后 添加到一个数组中 以便将它们显示为复选框 这是我的代码 result mysql query select path from audit where ind ind exp array wh
  • SPOJ ADDREV 问题

    我确实浏览了其他线程SPOJ http en wikipedia org wiki SPOJ问题 ADDREV https www spoj pl problems ADDREV 添加反转数字 但遗憾的是 我无法通过我编写的三个程序 C P
  • 即使我调用 componentHandler.upgradeDom(),汉堡包图标也不会显示;

  • 测试替身有哪些不同类型及其用途?

    我正在学习有关测试驱动开发的在线课程 并遇到了测试替身的概念 根据课程中测试替身的定义 测试双打 测试替身是在单元测试中用于替代实际生产系统协作者的对象 我知道测试双打是什么意思了 但后来有人提到 测试替身有多种类型 课程中提到的内容是 D
  • 将日期向量转换为 R 中的儒略日

    我有一列格式如下的日期 10年6月16日 我想提取儒略日 我有不同的岁月 我尝试过 julian 和 mdy date 函数 但似乎不起作用 尝试以下方法从类转换character 即文本 到课堂POSIXlt 然后提取儒略日 yday t
  • glDeleteBuffers() 在析构函数调用期间崩溃

    正如 Qt 用户所知 使用任何 OpenGL 扩展都可能非常麻烦 我让它工作的方法是扩展 QGLFunctions 类 如下所示 class Object3D protected QGLFunctions 为了使 Object3D 能够正确