如何在 glutMainLoop() 调用后清理内存?
How to clean up memory after glutMainLoop() call?
在我的 OpenGL 程序中,我想使用 c++ 'delete' 宏来清理内存。
但是,如您所知,当 OpenGL window 关闭时,它不会为 'main' 函数提供上下文,所以即使我编写这样的代码:
...
...
glutMainLoop();
//expected to be called after glutMainLoop()
delete[] a,b,c;
...
...
删除宏不会被调用。
有什么优雅的方法可以清理我的记忆吗?
C++ 中的第一要务 delete
不是宏,而是运算符。其次,您根本不应使用 new
和 delete
,而应使用 RAII,即依赖对象的作用域来释放它们。一旦一个对象超出范围,它的析构函数就会被调用,这允许您解除分配和完成。
话虽如此,在进程终止时清理你自己的身后主要是为了调试目的;如果您在清理例程中的某处遗留了一些东西,这意味着您的清理代码中存在错误。
然而,从资源释放的角度来看,显式释放操作系统资源实际上是一个 糟糕的 想法:在较长的 运行 进程中 OS将换掉所有未被积极使用的东西。因此,如果您分配了一些地址 space(通过代码、数据或其他方式)但不使用它,OS 将决定将其写出以交换 space 或 (如果资源已从存储中映射)以丢弃页面,以便仅在访问时才从存储中重新填充它。
如果您的进程只是终止,OS 可以简单地丢弃所有分配而无需再次查看,更重要的是无需从存储中分页内存内容。在必须调用特定重置代码的地方,这发生在需要的地方。
这正是最初 GLUT 的设计理念:使用完后立即终止该进程。请注意,在 GLUT-ish 程序中,您几乎不会在 main
中分配对象。这将通过输入事件处理程序之一或空闲函数中的交互式用户请求发生。这些也是释放不再需要的实例的地方。
您可以制作一个清理内存的函数,然后使用 atexit( function ) 调用 function 当程序正常终止时。把它放在 glutMainLoop() 之前才能正确调用。
在我的 OpenGL 程序中,我想使用 c++ 'delete' 宏来清理内存。 但是,如您所知,当 OpenGL window 关闭时,它不会为 'main' 函数提供上下文,所以即使我编写这样的代码:
...
...
glutMainLoop();
//expected to be called after glutMainLoop()
delete[] a,b,c;
...
...
删除宏不会被调用。 有什么优雅的方法可以清理我的记忆吗?
C++ 中的第一要务 delete
不是宏,而是运算符。其次,您根本不应使用 new
和 delete
,而应使用 RAII,即依赖对象的作用域来释放它们。一旦一个对象超出范围,它的析构函数就会被调用,这允许您解除分配和完成。
话虽如此,在进程终止时清理你自己的身后主要是为了调试目的;如果您在清理例程中的某处遗留了一些东西,这意味着您的清理代码中存在错误。
然而,从资源释放的角度来看,显式释放操作系统资源实际上是一个 糟糕的 想法:在较长的 运行 进程中 OS将换掉所有未被积极使用的东西。因此,如果您分配了一些地址 space(通过代码、数据或其他方式)但不使用它,OS 将决定将其写出以交换 space 或 (如果资源已从存储中映射)以丢弃页面,以便仅在访问时才从存储中重新填充它。
如果您的进程只是终止,OS 可以简单地丢弃所有分配而无需再次查看,更重要的是无需从存储中分页内存内容。在必须调用特定重置代码的地方,这发生在需要的地方。
这正是最初 GLUT 的设计理念:使用完后立即终止该进程。请注意,在 GLUT-ish 程序中,您几乎不会在 main
中分配对象。这将通过输入事件处理程序之一或空闲函数中的交互式用户请求发生。这些也是释放不再需要的实例的地方。
您可以制作一个清理内存的函数,然后使用 atexit( function ) 调用 function 当程序正常终止时。把它放在 glutMainLoop() 之前才能正确调用。