如何在glutMainLoop()调用后清理内存?

时间:2016-01-28 08:01:25

标签: c++ opengl memory-management glut

在我的OpenGL程序中,我想通过使用c ++'删除'来清理记忆。宏。 但是,正如您所知,当OpenGL窗口关闭时,它不会给主要'主要'函数,所以即使我写这样的代码:

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

删除宏不会被调用。 是否有任何优雅的方式来清理我的记忆?

2 个答案:

答案 0 :(得分:0)

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

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

然而,从资源释放的角度来看,实际上是一个错误的想法来显式释放操作系统资源:在长时间运行的过程中,操作系统将交换掉所有未被主动使用的内容。因此,如果您分配了一些地址空间(通过代码,数据或其他内容)但不使用它,操作系统将决定将其写入交换空间或(如果资源已从存储中映射)丢弃这些页面,只有当它被访问时才从存储中重新填充。

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

这是设计原始GLUT的确切思维方式:只需在完成使用后终止该过程。请注意,在GLUT-ish程序中,您很难在main中分配对象。它将通过其中一个输入事件处理程序中的交互式用户请求或在空闲功能中发生。这些也是不再需要实例的地方。

答案 1 :(得分:-1)

您可以创建一个清除内存的函数,然后使用 atexit function )在程序执行时调用 function 正常终止。将其放在 glutMainLoop()之前,以便正确调用。