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

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

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

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

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

C++

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

Q&A

解決済

1回答

1907閲覧

C++ OpenGL メモリリーク 原因がわかりません

ganjo

総合スコア9

OpenGL

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

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

C++

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

0グッド

0クリップ

投稿2021/06/07 11:18

C++/OpenGLを使ってゲームを作っています。
同じコードでMac、Windows両方動くので両方でメモリリークを確認しました。

MacのXCodeでメモリリークの原因を探ってみたのですが、
どうやら自分の描いたコードで直接的な原因では無いようで、どこでメモリリークが発生しているのか
わかりません。(newでdeleteしてないなどの直接的な原因ではない、OpenGLの関数で開放し忘れている)

このSquareShapeクラスを使っている場所でSquareShapeクラスを
newで6つ使っています。

素人なのでコードがわかりづらい、文字制限で載せられないですがよろしくお願いします。
必要な情報が足らないようでしたら補足します。

試したこと

このSquareShapeクラスを6つ使っている場所で5つをコメントアウトし、
一つだけnewで使うとメモリリークは無くなります。
ですが2つ以上newするとメモリリークが発生します。
作ったオブジェクトはすべてdeleteしています。

補足情報(FW/ツールのバージョンなど)

OpenGL 3.2
メモリリークはしていますが動きます。

C++

1//SquareShapeクラス,public Textureクラス継承 2 3SquareShape::SquareShape(Frame f) 4: location { 0.0, 0.0 }, fLocation { 0.0, 0.0 }, alpha{0.0, 0.0, 0.0, 0.0}, texureBindFrag(false) , frame(f.size, f.position) { this->program = loadProgram("object.vert", "object.frag"); } 5 6SquareShape::SquareShape(GLdouble width, GLdouble height, GLdouble x, GLdouble y) 7: location { 0.0, 0.0 }, fLocation { 0.0, 0.0 }, alpha{0.0, 0.0, 0.0, 0.0}, texureBindFrag(false), frame(width, height, x, y) { this->program = loadProgram("object.vert", "object.frag"); } 8 9SquareShape::SquareShape(Size s, Position p) 10: location { 0.0, 0.0 }, fLocation { 0.0, 0.0 }, alpha{0.0, 0.0, 0.0, 0.0}, texureBindFrag(false), frame(s ,p) { this->program = loadProgram("object.vert", "object.frag"); } 11 12SquareShape::SquareShape(Size s, GLdouble x, GLdouble y) 13: location { 0.0, 0.0 }, fLocation { 0.0, 0.0 }, alpha{0.0, 0.0, 0.0, 0.0}, texureBindFrag(false), frame(s, x, y) { this->program = loadProgram("object.vert", "object.frag"); } 14 15SquareShape::SquareShape(GLdouble width, GLdouble height, Position p) 16: location { 0.0, 0.0 }, fLocation { 0.0, 0.0 }, alpha{0.0, 0.0, 0.0, 0.0}, texureBindFrag(false), frame(width, height, p) { this->program = loadProgram("object.vert", "object.frag"); } 17 18SquareShape::~SquareShape() { 19 glDeleteVertexArrays(1, &vao); 20 glDeleteBuffers(1, &vbo); 21 glDeleteBuffers(1, &uv_vbo); 22 glDeleteBuffers(1, &colorVbo); 23 glDeleteBuffers(1, &alphaVbo); 24 glDeleteProgram(this->program); 25} 26 27void SquareShape::setShaderProgram(GLuint program) { 28 this->program = program; 29} 30 31void SquareShape::createSquare() { 32 vertexInit(); 33 createVbo(); 34} 35 36void SquareShape::bindVao() { 37 glBindVertexArray(vao); 38} 39 40void SquareShape::bindVbo() { 41 glBindBuffer(GL_ARRAY_BUFFER, vbo); 42} 43 44void SquareShape::createVbo() { 45 glGenVertexArrays(1, &vao); 46 bindVao(); 47 48 glGenBuffers(1, &vbo); 49 glEnableVertexAttribArray(0); 50 glBindBuffer(GL_ARRAY_BUFFER, vbo); 51 glBufferData(GL_ARRAY_BUFFER, sizeof (Vertex), &vertex, GL_STATIC_DRAW); 52 glVertexAttribPointer(0, 2, GL_DOUBLE, GL_FALSE, 0, 0); 53 54 // テクスチャのvbo 55 //追加:テクスチャのUV座標を格納するためのVBOを作成 56 glEnableVertexAttribArray(1); 57 glGenBuffers(1, &uv_vbo); 58 glBindBuffer(GL_ARRAY_BUFFER, uv_vbo); 59 glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_uv), &vertex_uv, GL_STATIC_DRAW); 60 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (char *)0 + sizeof(GLfloat) * 8); 61 62 glEnableVertexAttribArray(2); 63 glGenBuffers(1, &colorVbo); 64 glBindBuffer(GL_ARRAY_BUFFER, colorVbo); 65 glBufferData(GL_ARRAY_BUFFER, sizeof(color), color, GL_STATIC_DRAW); 66 glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, 0); 67 68 glEnableVertexAttribArray(3); 69 glGenBuffers(1, &alphaVbo); 70 glBindBuffer(GL_ARRAY_BUFFER, alphaVbo); 71 glBufferData(GL_ARRAY_BUFFER, sizeof(alpha), alpha, GL_STATIC_DRAW); 72 glVertexAttribPointer(3, 1, GL_FLOAT, GL_FALSE, 0, 0); 73 74 glBindVertexArray(0); 75} 76 77void SquareShape::vertexInit() 78{ 79 vertex.lowerLeft.x = this->frame.position.x; // WINDOW_ASPECT 80 vertex.lowerLeft.y = this->frame.position.y; 81 82 vertex.lowerRight.x = vertex.lowerLeft.x + this->frame.size.width; 83 vertex.lowerRight.y = vertex.lowerLeft.y; 84 85 vertex.upperRight.x = vertex.lowerRight.x; 86 vertex.upperRight.y = vertex.lowerRight.y + this->frame.size.height; 87 88 vertex.upperLeft.x = vertex.lowerLeft.x; 89 vertex.upperLeft.y = vertex.upperRight.y; 90} 91 92void SquareShape::changeColor(GLfloat red, GLfloat green, GLfloat blue) { 93 for(int i = 0; i < 4; i++){ 94 color[i].red = red; 95 color[i].green = green; 96 color[i].blue = blue; 97 } 98 bindVao(); 99 100 glBindBuffer(GL_ARRAY_BUFFER, colorVbo); 101 glBufferData(GL_ARRAY_BUFFER, sizeof(color), color, GL_STATIC_DRAW); 102 glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, 0); 103} 104 105void SquareShape::changeAlpha(GLfloat alpha) { 106 this->alpha[0] = 1.0 - alpha; 107 this->alpha[1] = 1.0 - alpha; 108 this->alpha[2] = 1.0 - alpha; 109 this->alpha[3] = 1.0 - alpha; 110 111 bindVao(); 112 113 glBindBuffer(GL_ARRAY_BUFFER, alphaVbo); 114 glBufferData(GL_ARRAY_BUFFER, sizeof(this->alpha), this->alpha, GL_STATIC_DRAW); 115 glVertexAttribPointer(3, 1, GL_FLOAT, GL_FALSE, 0, 0); 116} 117 118void SquareShape::setBindTexture(bool set) { 119 this->texureBindFrag = set; 120} 121 122void SquareShape::draw() { 123 glUseProgram(this->program); 124 if(this->texureBindFrag) this->bindTexture(0); 125 else glBindTexture(GL_TEXTURE_2D, 0); 126 bindVao(); 127 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 128 glBindTexture(GL_TEXTURE_2D, 0); 129 glBindVertexArray(0); 130 glUseProgram(0); 131} 132 133const GLfloat* SquareShape::getLocation() const 134{ 135 return fLocation; 136}

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

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

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

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

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

guest

回答1

0

自己解決

vaoのglDeleteVertexArraysをコメントアウトしたらメモリリークが無くなりました。

投稿2021/06/07 13:33

ganjo

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問