質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3273閲覧

C++ メモリの解放の仕方

seri

総合スコア422

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2016/09/08 16:55

メモリが大量に使用されて困っています。
解放すればいいのか、放っておいてもいいのかわからない状況です

コードですが
ヘッダに以下の構造体があります

C++

1vector<CUSTOM_VERTEX> cverts; 2 struct CUSTOM_VERTEX 3 { 4 GLfloat tx, ty; 5 GLfloat r, g, b, a; 6 GLfloat nx, ny, nz; 7 GLfloat x, y, z; 8 };

この構造体を使っている関数内の処理です

C++

12 for (int i = 0; i <1000 i++) { 3 CUSTOM_VERTEX cv = { 4 ...割愛 5 }; 6 cverts.push_back(cv); 7 } 8 glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); 9 glBufferData(GL_ARRAY_BUFFER, cverts.size() * sizeof(CUSTOM_VERTEX), &cverts[0], GL_DYNAMIC_DRAW); 10 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VboIdx[0]); 11 glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexs.size() * sizeof(int), &indexs[0], GL_DYNAMIC_DRAW); 12 13 glBindBuffer(GL_ARRAY_BUFFER, 0); 14 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 15

この処理を何度も呼び出したところ、プロセスメモリに大量のCUSTOM_VERTEX構造体が存在するようになりました。
そこで、このメモリを解放したいのですが方法がわかりません。。

試して効果がなかったコード

glDeleteBuffers(1,buffers); cverts.clear();

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

vectorは
cverts.clear();ではメモリが解放されないため
std::<CUSTOM_VERTEX>(cverts).swap(cverts);
とする必要があったようです、皆さまありがとうございました。

投稿2016/09/08 22:03

seri

総合スコア422

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

一部だけだとちょっと何をしたいコードなのかよくわかりません。
特にbuffersを宣言しているところが怪しい気がしますし、そもそも使い方がおかしいような?

やりたいことは下記のURLのようなことですよね?
http://asura.iaigiri.com/OpenGL/gl43.html

投稿2016/09/08 18:06

CodeLab

総合スコア1939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seri

2016/09/08 18:09

回答ありがとうございます 添付していただいたサイトのような事を実装しています、Openglに関してはまだまだわからない事も多いので言えることは少ないのですが、今回は添付先の使い方とは少し違う実装をしていまして、動作面では問題ありません。
CodeLab

2016/09/08 18:18

頂点バッファはまずglGenBuffers()で初期化するようですが、どのように書いてますか?
seri

2016/09/08 18:24

glGenBuffers(1, &buffers[0]); glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); glBufferData(GL_ARRAY_BUFFER, cverts.size() * sizeof(CUSTOM_VERTEX), &cverts[0], GL_DYNAMIC_DRAW); glGenBuffers(1, &VboIdx[0]); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VboIdx[0]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexs.size() * sizeof(int), &indexs[0], GL_DYNAMIC_DRAW);
seri

2016/09/08 18:26

長いので割愛させていただきましたが、indexsには頂点Idが入ります。
seri

2016/09/08 18:30

glDeleteBuffers(1, &buffers[0]);だけでは、glBufferDataで確保した領域を解放してくれないのでしょうか。。
CodeLab

2016/09/08 18:39

初期化部分が全部書いてないのでわかりませんが、 GLuint buffers[100]; if ( glewInit() != GLEW_OK ){ cout << "Error : GLEWの初期化に失敗\n"; exit(0); } glGenBuffers(1, &buffers[0]); 以下略 といった感じでは?
seri

2016/09/08 18:43

ヘッダファイル内で GLuint buffers[..]としています。
seri

2016/09/08 18:45

glBindBufferで使用されたメモリは、動的に削除する事ができないのでしょうかね
seri

2016/09/08 18:47

つまりは、強制的にガベージコレクションでこねこねされるのを待つ仕様なのかも。。
seri

2016/09/08 19:13

おそらく、glDeleteBuffersはメモリを開放はしてくれるけど、すぐに解放するわけではないとゆう意味だと思います。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問