【问题标题】:How to clean up memory after glutMainLoop() call?glutMainLoop() 调用后如何清理内存?
【发布时间】:2016-01-28 08:01:24
【问题描述】:

在我的 OpenGL 程序中,我想通过使用 c++ 'delete' 宏来清理内存。 但是,如您所知,当 OpenGL 窗口关闭时,它不会为“主”函数提供上下文,所以即使我编写这样的代码:

...
...
glutMainLoop();
//expected to be called after glutMainLoop()
delete[] a,b,c;
...
...

删除宏不会被调用。 有什么优雅的方式可以清理我的记忆吗?

【问题讨论】:

  • 如果 a,b,c(如代码中所示)要在循环中使用,它们应该在循环中分配和释放,而不是在当前函数中。
  • 检查thisthis

标签: c++ opengl memory-management glut


【解决方案1】:

C++ 中的第一件事 delete 不是宏,而是运算符。其次,您根本不应该使用newdelete,而是使用RAII,即依赖对象的范围来释放它们。一旦一个对象超出范围,它的析构函数就会被调用,这允许你解除分配和终结。

话虽如此,在进程终止时清理自己的背后很重要,主要用于调试目的;如果您在清理例程中的某个地方留下了一些东西,这意味着您在清理代码中存在错误。

但是,从资源释放的角度来看,显式释放操作系统资源实际上是一个糟糕的想法:在长时间运行的进程中,操作系统将交换掉所有没有被积极使用的东西。因此,如果您分配了一些地址空间(通过代码、数据或其他东西)但不使用它,操作系统将决定将其写出到交换空间或(如果资源已从存储映射)丢弃页面,因此只有在被访问时才会从存储中重新填充。

如果您的进程刚刚终止,则操作系统可以简单地丢弃所有分配而无需再次查看,更重要的是无需从存储中分页内存内容。在必须调用特定重置代码的情况下,这会发生在需要的地方。

这正是最初 GLUT 的设计理念:使用完后终止进程即可。请注意,在 GLUT-ish 程序中,您几乎不会在 main 中分配对象。它将通过输入事件处理程序之一中的交互式用户请求或在空闲函数中发生。这些也是释放不再需要的实例的地方。

【讨论】:

  • "第二个你根本不应该使用 new 和 delete" aaand instant -1.
  • @Blindy:很公平,但是请详细说明为什么不这样做,这样阅读您评论的人就不会对您的意思感到困惑。说真的,在正确编写的现代 C++ 程序中直接使用 newdelete 没有任何理智的理由(除非您正在编写内存分配器)。你想要一个数组?使用std::vector。你需要一个你持有指针的实例吗?使用std::shared_ptr
【解决方案2】:

您可以制作一个清理内存的函数,然后在程序正常终止时使用 atexit( function ) 调用 function .将它放在 glutMainLoop() 之前以正确调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-11
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    相关资源
    最近更新 更多