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

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

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

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

メモリリーク

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

C++

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

Q&A

解決済

2回答

6075閲覧

メモリーリークと思われるがどうしても場所がわからない。原因と場所。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

メモリリーク

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

C++

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

0グッド

0クリップ

投稿2020/09/10 07:36

提示コードの一番下のところでブレークポイントが発生してしまいます。また提示画像にもある通り文章を日本語にすると

「CRT detected that the application wrote to memory after end of heap buffer」
日本語 「CRTは、ヒープバッファーの終了後にアプリケーションがメモリに書き込んだことを検出しました」
と表示されています。一体どこでメモリリークが発生しているのでしょうか? またマイクロソフトのサイトは専門的過ぎてわかりません。
malloc();してある場所だと思い自分でいろいろprintf();を置いてどこまで実行出来ているか探りましたがわかりません

参考サイト: https://so-zou.jp/software/tech/programming/cpp/run-time-library/memory/
参考サイト: https://docs.microsoft.com/ja-jp/previous-versions/technical-document/ms810466(v=msdn.10)?redirectedfrom=MSDN

イメージ説明

//シェーダー関係のログを取得 void Game::GetShader_Log(GLuint shader_type, GLuint Log_type) { GLint bufferSize = 0; GLchar* infoLog = nullptr; //成功したかどうか? glGetShaderiv(shader_type, Log_type, &bufferSize); //ログの長さを取得する glGetShaderiv(shader_type, GL_INFO_LOG_LENGTH, &bufferSize); infoLog = (GLchar*)malloc(sizeof(bufferSize + 10)); if (infoLog != NULL) { GLsizei length;//ログの長さ glGetShaderInfoLog(shader_type, bufferSize, &length, infoLog); if (length > 1)//null文字を含むため一文字以上の場合ログ出力 { fprintf(stderr, "InfoLog:%s\n\n", infoLog); } printf("ああああ\n"); free(infoLog); infoLog = NULL; printf("いいいいいい\n"); } //return true; }

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

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

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

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

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

dodox86

2020/09/10 08:39

> infoLog = (GLchar*)malloc(sizeof(bufferSize + 10)); の、sizeof(bufferSize + 10) は何なのでしょう。意図通りですか? もう少し丁寧にコーディングしましょう。
退会済みユーザー

退会済みユーザー

2020/09/10 08:46

なんとんなくもう少し多くメモリを確保したら溢れないのかなと思いましたがこれはそれとは別に悪い行為なのでしょうか?
dodox86

2020/09/10 08:52 編集

いやそういうことではなく、そもそもsizeof(bufferSize + 10) とは何に対するsizeof演算子か?と言うことです。bufferSizeはGLint型であり、更に +10 に対するsizeofって???何? です。
退会済みユーザー

退会済みユーザー

2020/09/10 08:52

なるほど。sizeof(bufferSize);に変更しました。また誤字だと思われますがGLintですよね?
dodox86

2020/09/10 08:53

(GLintの誤記は修正済みです) sizeof(bufferSize)じゃダメでしょう。それは実質sizeof(GLint) です。
退会済みユーザー

退会済みユーザー

2020/09/10 08:56

自己解決しました。回答をご覧ください。
guest

回答2

0

日本語 「CRTは、ヒープバッファーの終了後にアプリケーションがメモリに書き込んだことを検出しました」

それはメモリリークとは別物です。メモリリークは、「使いもしないメモリを確保したまま放置状態となっている」という事象です。

投稿2020/09/10 07:41

maisumakun

総合スコア145121

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

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

退会済みユーザー

退会済みユーザー

2020/09/10 08:50

そうですかしかしちゃんとfree();しているはずなのですがなぜでしょうか?
guest

0

ベストアンサー

cpp

1infoLog = (GLchar*)malloc(sizeof(bufferSize + 10));

コードを

cpp

1infoLog = (GLchar*)malloc(bufferSize);

に変更したら治りました。sizeofはその変数のメモリの数字が返ってくるので違いますよね
その変数の値がそのバイトなのでGLintつまり4バイトのメモリが返ってきますが文字列は可変長なので
必ず4バイトとも限りませんよってこれは違います。buferSizeだけでいいのですその中の数字が重要なので

投稿2020/09/10 08:55

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問