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

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

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

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

メモリリーク

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

C++

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

Q&A

解決済

1回答

1557閲覧

freetypeによる文字描画でメモリリークしている原因がわからない

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

メモリリーク

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

C++

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

0グッド

0クリップ

投稿2021/05/21 08:55

編集2021/05/21 09:21

提示コードですがfreetypeライブラリを使った文字描画なのですがなぜメモリリークしてしまうのでしょうか?原因がわかりません。デバッグするとコメント部内部のコードなのですが何が原因なのでしょうか?検討が付きません。

クラスのインスタンを生成して.Draw関数つまり提示コードの関数を乗せるとメモリリークします。インスタンを生成しただけではメモリリークはしません。

cpp

1 2void FrameWork::Text::Draw(glm::vec2 pos, const char* text, float scale, glm::vec3 color) 3//void FrameWork::Text::Draw(glm::vec2 pos, std::string text,float scale, glm::vec3 color) 4{ 5 setEnable(); //シェーダーを有効にする 6 7 pos.y = windowContext->getSize().y - pos.y - charSize; 8 9 //テクスチャをアクティブ 10 glActiveTexture(GL_TEXTURE0); 11 glBindVertexArray(vao); 12 13 //Unform 14 setUniform3f("textColor", color); 15 setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, windowContext->getSize().x, 0.0f, windowContext->getSize().y)); 16 17 //char text[] = "テスト"; 18 //wchar_t txt[strlen(text)] = { L'\0' }; 19 wchar_t txt[100000] = { L'\0' };// = (wchar_t*)malloc(strlen(text)); 20 21 22 23 int i, j, f; 24 for (i = 0, j = 0; text[j]; i++, j += f) 25 { 26 f = (int)mbrtowc(txt + i, &text[j], (size_t)MB_CUR_MAX, nullptr); 27 } 28 29 /////////////////////////////////////////////////////////////////////////////////////////////////////// 30 for (int i = 0; txt[i] != L'\0'; i++) 31 { 32 //std::cout << txt[i] <<std::endl; 33 unsigned int texture = 0; 34 35 // load character glyph 36 FT_Load_Glyph(face, FT_Get_Char_Index(face, txt[i]), FT_LOAD_RENDER); 37 38 39 // now store character for later use 40 Character ch = { 41 texture, 42 glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows), 43 glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top), 44 (unsigned int)face->glyph->advance.x 45 46 }; 47 48 49 // generate texture 50 glGenTextures(1, &ch.textureID); 51 glBindTexture(GL_TEXTURE_2D, ch.textureID); 52 53 glTexImage2D( 54 GL_TEXTURE_2D, 55 0, 56 GL_RED, 57 face->glyph->bitmap.width, 58 face->glyph->bitmap.rows, 59 0, 60 GL_RED, 61 GL_UNSIGNED_BYTE, 62 face->glyph->bitmap.buffer 63 ); 64 // set texture options 65 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 66 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 67 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 68 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 69 // now store character for later use 70 71 72 73 float xpos = pos.x + ch.Bearing.x * scale; 74 float ypos = pos.y - (ch.Size.y - ch.Bearing.y) * scale; 75 76 float w = ch.Size.x * scale; 77 float h = ch.Size.y * scale; 78 // update VBO for each character 79 float vertices[6][4] = { 80 { xpos, ypos + h, 0.0f, 0.0f }, 81 { xpos, ypos, 0.0f, 1.0f }, 82 { xpos + w, ypos, 1.0f, 1.0f }, 83 84 { xpos, ypos + h, 0.0f, 0.0f }, 85 { xpos + w, ypos, 1.0f, 1.0f }, 86 { xpos + w, ypos + h, 1.0f, 0.0f } 87 }; 88 // render glyph texture over quad 89 // update content of VBO memory 90 glBindBuffer(GL_ARRAY_BUFFER, vbo); 91 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); 92 glBindBuffer(GL_ARRAY_BUFFER, 0); 93 94 // render quad 95 glDrawArrays(GL_TRIANGLES, 0, 6); 96 97 98 99 // now advance cursors for next glyph (note that advance is number of 1/64 pixels) 100 pos.x += ((ch.Advance >> 6) * scale); // bitshift by 6 to get value in pixels (2^6 = 64) 101 102 } 103 104//////////////////////////////////////////////////////////////////////////////////////////////////////////////// 105 106 107 glBindVertexArray(0); 108 glBindTexture(GL_TEXTURE_2D, 0); 109 setDisable(); //シェーダーを無効にする 110} 111 112 113 114FrameWork::Text::~Text() 115{ 116 //グリフ解放 117 FT_Done_Face(face); 118 FT_Done_FreeType(ft); 119 120 glDeleteVertexArrays(1, &vao); 121 glDeleteBuffers(1, &vbo); 122} 123

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/05/21 09:13

どのようにメモリリークしていると判断したのでしょうか。
退会済みユーザー

退会済みユーザー

2021/05/21 09:17

デバッガのメモリ使用率がどんどん上がっているののとコメントアウトしたらメモリ利用率が上がらないので
退会済みユーザー

退会済みユーザー

2021/05/21 09:19

何をしたときにメモリの使用率がどんどん上がって、何をコメントアウトしたら上がらなかったのか、 質問に追記してください。
guest

回答1

0

ベストアンサー

glGenTextures(1, &ch.textureID) に対応する glDeleteTextures() がないからでは。

もし自分がC++でOpenGLを扱うことになったら、以下のような RAII クラスを作ると思います。

c++

1class ScopedTexture { 2 public: 3 ScopedTexture() { 4 glGenTextures(1, &texture_); 5 } 6 ~ScopedTexture() { 7 glDeleteTextures(1, &texture_); 8 } 9 ScopedTexture(const ScopedTexture&) = delete; 10 ScopedTexture& operator=(const ScopedTexture&) = delete; 11 12 Bind(GLenum target) { 13 glBindTexture(target, texture_); 14 } 15 16 private: 17 GLuint texture_; 18};

投稿2021/05/21 09:21

編集2021/05/21 14:17
int32_t

総合スコア20832

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問