2011-09-09 10 views
0

私はC++とfreeglutを使い、newを使って動的に割り当てられたメモリを削除する方法を知りたいと思っています。ウィンドウを閉じるときにメモリを解放する必要があります。どこに置くべきですかdelete pointerglutMainLoop()の前に?OpenGLで動的に割り当てられたメモリを削除する

* 更新 *です。

たとえば、頂点座標を格納するのにint *ptr = new int[n]を使用し、コードでclassを使用しませんでした。だからmain()deleteに電話してメモリを解放する必要があります。私は同じことをするためにベクトルを使用できることを理解しています。しかし、私の場合、newを使用する必要がある場合、どのようにしてメモリの割り当てを解除できますか?

+0

どのように_what_割り当てられたメモリを削除しますか?どのポインタを削除しようとしていますか? –

答えて

3

旧式のGLUTは、プログラムの実行がglutMainLoopの呼び出しから返されないようにしました。 FreeGLUTはこれを取り除きますが、あなたは、具体的glutMainLoopを呼び出す前にそれを求める場合にのみ:

glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION); 

これは、あなたが最終的にglutLeaveMainLoopを呼び出すときに、FreeGLUTは普通の関数呼び出しと同じように、glutMainLoopが呼ばれたところから継続する、ということを意味します。

したがって、glutMainLoopの前にメモリを割り当てると、そのメモリを削除することができます。言われてそれ

:私は頂点を記憶するためにINT *ptr = new int[n]を使用

座標なぜ代わりにポインタのstd::vector<int> mem(n);ことはないですか? &mem[0]を実行しても、メモリへのポインタを取得できます。そしてそれはそれ自身の後できれいになるでしょう。

+0

ニコル、あなたの最後のアイデアはうまくいかないと思う。 std :: vectorはmain()関数のスタック上にあります。 gluMainLoopがexit()を呼び出してアプリケーションを終了させると、スタックに割り当てられた変数はすべてリークします。フリーループでGLUT_ACTION_CONTINUE_EXECUTIONモードを使用してmain()関数を正常に戻す場合、ベクターは単独で解除されます。 – Miguel

+0

@Miguel:本当ですが、プロセスを終了しているので問題はありません。 OSはプロセスのメモリを解放します。このメモリを実際にクリーンアップすることがあるレベルで問題になる場合は、 'glutMainLoop'の後にコードが実行されるかどうかが問題になります。デバッガでプログラムを実行し、コースを実行させる代わりに停止させるようなものです。期限内に世話をする予定です。 –

+0

私は知っているが、私はそれを指摘するべきだと思った。元の質問は正当性に関するもので、彼が割り当てたメモリを削除したいのですが、それは良い原則だと思います。しかし、私はこの場合、実際にそれを行う技術的理由がないことに同意します。 – Miguel

1

OpenGL GLUT FAQの質問3.0.70を参照してください。簡単な答えは、atexit()呼び出しでインストールされたexitハンドラを使用することです。

+0

faqは非常に古く、彼はFreeGLUTを使用しています。これは制御を 'main'に戻すことができます。彼は必要があればそれをすべきだが、私は彼がそれを提案する前に何を話しているのかを明確にしたい。 –

+0

私はフリージェットが元のGLUTからこの点に関して逸脱していることを知りませんでした。しかし、私はFAQが時代遅れだとは思わない。元のGLUTには終了時にこの制限がありますので、あなたが100%確実でない限り、アプリケーションを元のGLUTに移植することは決してありません。フリーGLUTを使用している場合でも元のGLUT APIを守ることをお勧めします。 – Miguel

+0

元のGLUTは10年以上も更新されていません。 FreeGLUTが(moresoではないにしても)広くサポートされているときに、誰かがそれを自分自身に制限する魅力的な理由がわからないし、追加の便利な機能を提供します。 –

1

スマートポインタを使用すると、心配する必要はありません。

+0

OSGは 'osg :: ref_ptr'を持っています。さもなければ新しいC++標準からのブーストまたはスマートポインタを使うことができます。 – AJG85

+0

ニースの迂回ですが、それ以外のものはありません。 –