在openGL中删除动态分配的内存 我使用C++和FLUEGLUT,想知道如何用新的方法删除动态分配的内存。我需要在关窗时释放内存。我应该把这个删除指针放在哪里?在这之前

在openGL中删除动态分配的内存 我使用C++和FLUEGLUT,想知道如何用新的方法删除动态分配的内存。我需要在关窗时释放内存。我应该把这个删除指针放在哪里?在这之前,c++,glut,C++,Glut,*更新* 例如,我使用int*ptr=newint[n]来存储顶点坐标,但在代码中没有使用类。因此,我必须在main中调用delete来释放内存。我知道我可以用vector做同样的事情。但在我的情况下,如果我必须使用new,我如何释放内存 请参见中的问题3.0.70。简短的回答是使用通过atexit调用安装的退出处理程序。请参阅中的问题3.0.70。简短的回答是使用通过atexit调用安装的退出处理程序。使用智能指针,您就不必担心它。使用智能指针,您就不必担心它。旧的GLUT形式使得您的程序的执

*更新*


例如,我使用int*ptr=newint[n]来存储顶点坐标,但在代码中没有使用类。因此,我必须在main中调用delete来释放内存。我知道我可以用vector做同样的事情。但在我的情况下,如果我必须使用new,我如何释放内存

请参见中的问题3.0.70。简短的回答是使用通过atexit调用安装的退出处理程序。

请参阅中的问题3.0.70。简短的回答是使用通过atexit调用安装的退出处理程序。

使用智能指针,您就不必担心它。

使用智能指针,您就不必担心它。

旧的GLUT形式使得您的程序的执行不会从glutMainLoop调用返回。FreeGLUT可以解决这个问题,但前提是您在调用glutMainLoop之前明确要求:

这意味着,当您最终调用GLUTLEVEMAINLOOP时,FreeGLUT将从调用glutMainLoop的位置继续,就像常规函数调用一样

所以,如果在GLUTmain循环之前分配内存,则可以在循环之后删除该内存

也就是说:

我使用int*ptr=newint[n]来存储顶点坐标


为什么这不是一个std::vector memn;而不是指针?您仍然可以通过执行&mem[0]来获取指向内存的指针。它会在自己之后清理干净。

旧的GLUT形式使得程序的执行不会从glutMainLoop调用中返回。FreeGLUT可以解决这个问题,但前提是您在调用glutMainLoop之前明确要求:

这意味着,当您最终调用GLUTLEVEMAINLOOP时,FreeGLUT将从调用glutMainLoop的位置继续,就像常规函数调用一样

所以,如果在GLUTmain循环之前分配内存,则可以在循环之后删除该内存

也就是说:

我使用int*ptr=newint[n]来存储顶点坐标


为什么这不是一个std::vector memn;而不是指针?您仍然可以通过执行&mem[0]来获取指向内存的指针。并且它会在自己之后进行清理。

如何删除分配的内存?您要删除的指针是什么?如何删除分配的内存?OSG有OSG::RefPyTR,否则你可以使用新C++标准的Boost或智能指针。漂亮的规避,但没有别的。OSG有OSG::RefPyTR,否则你可以使用Buffor或C++新的智能指针。漂亮的规避,但没有别的。FAQ很老,他使用FreeGLUT,它可以将控制权返回到main。如果需要的话,他应该这样做,但我想在提出建议之前澄清一下他在说什么。我不知道freeglut在这方面偏离了最初的过剩,谢谢你指出这一点。但我不认为FAQ已经过时了。原始GLUT在退出时有此限制,因此,除非您100%确定您永远不想将应用程序移植到原始GLUT,否则即使在使用freeglut时,坚持原始GLUT API也是一种良好的做法。原始GLUT已经10多年没有更新过了。我不确定是否有令人信服的理由让某些人将自己局限于此,因为FreeGLUT即使不是更广泛,也同样得到广泛支持,并提供了额外的有用功能。我确认,OS X附带的GLUT版本符合原始API。因此,如果你曾经计划为该操作系统发布一个应用程序,并且希望避免必须发布一个自定义框架,我认为将自己限制在原始API是一个好主意。GLUT不是OpenGL。这不是系统提供的东西。或者至少,你不应该依赖于系统提供的过剩。如果您正在分发一个使用FreeGLUT编写的应用程序,那么您也应该分发FreeGLUT。那个常见问题解答非常古老,他正在使用FreeGLUT,它可以将控制权返回到主控。如果需要的话,他应该这样做,但我想在提出建议之前澄清一下他在说什么。我不知道freeglut在这方面偏离了最初的过剩,谢谢你指出这一点。但我不认为FAQ已经过时了。原始GLUT在退出时有此限制,因此,除非您100%确定您永远不想将应用程序移植到原始GLUT,否则即使在使用freeglut时,坚持原始GLUT API也是一种良好的做法。原始GLUT已经10多年没有更新过了。我不确定是否有令人信服的理由让某些人将自己局限于此,因为FreeGLUT即使不是更广泛,也同样得到广泛支持,并提供了额外的有用功能。我确认,OS X附带的GLUT版本符合原始API。因此,如果您计划为该操作系统发布应用程序,并且希望避免必须发布自定义框架
我认为限制自己使用原始API是个好主意。GLUT不是OpenGL。这不是系统提供的东西。或者至少,你不应该依赖于系统提供的过剩。如果你正在分发一个用FreeGLUT编写的应用程序,你也应该分发FreeGLUT。Nicol,我认为你最后的想法行不通。std::vector将位于主函数的堆栈上。如果gluMainLoop通过调用exit终止应用程序,则堆栈上分配的任何变量都将泄漏。只有在freeglut中使用GLUT_ACTION_CONTINUE_执行模式使主函数优雅地返回时,向量才会自动解除分配。@Miguel:是的,但由于您正在退出进程,所以这并不重要。操作系统将释放进程的内存。如果清理这个内存实际上在某种程度上是重要的,那么唯一重要的方法就是代码是否在GLUTmain循环之后执行。这就像在调试器中运行一个程序并停止它,而不是让它运行它的过程。我知道,但我想我应该指出这一点。最初的问题是关于正确性,他想删除他分配的内存,我认为这是一个好原则。但我同意,在这种情况下,并没有什么技术上的理由可以这么做。@Nicol:你的意思是如果我关闭窗口,程序将从主循环返回吗?然后程序将在glutMainLoop之后继续执行代码?@Nicol:我找到了答案,它将继续执行代码。正当如果我使用向量,有什么问题吗?在哪里可以找到详细的文档。freeglut API文档没有说明关于glutSetOptionNicol的任何内容,我认为你最后的想法行不通。std::vector将位于主函数的堆栈上。如果gluMainLoop通过调用exit终止应用程序,则堆栈上分配的任何变量都将泄漏。只有在freeglut中使用GLUT_ACTION_CONTINUE_执行模式使主函数优雅地返回时,向量才会自动解除分配。@Miguel:是的,但由于您正在退出进程,所以这并不重要。操作系统将释放进程的内存。如果清理这个内存实际上在某种程度上是重要的,那么唯一重要的方法就是代码是否在GLUTmain循环之后执行。这就像在调试器中运行一个程序并停止它,而不是让它运行它的过程。我知道,但我想我应该指出这一点。最初的问题是关于正确性,他想删除他分配的内存,我认为这是一个好原则。但我同意,在这种情况下,并没有什么技术上的理由可以这么做。@Nicol:你的意思是如果我关闭窗口,程序将从主循环返回吗?然后程序将在glutMainLoop之后继续执行代码?@Nicol:我找到了答案,它将继续执行代码。正当如果我使用向量,有什么问题吗?在哪里可以找到详细的文档。freeglut API文档没有说明关于glutSetOption的任何内容
glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION);