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

问题描述 投票:1回答:2

在我的OpenGL程序中,我想通过使用c ++'delete'宏来清理记忆。但是,如你所知,当OpenGL窗口关闭时,它不会给'main'函数提供上下文,所以即使我写这样的代码:

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

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

c++ opengl memory-management glut
2个回答
0
投票

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

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

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

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

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


-1
投票

你可以创建一个清理内存的函数,然后使用在程序正常终止时调用函数的atexit(函数)。把它放在glutMainLoop()之前正确调用。

© www.soinside.com 2019 - 2024. All rights reserved.