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

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

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

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

デバッグ

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

メモリリーク

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

C++

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

Q&A

解決済

メモリアクセス違反が発生する原因がどうしてもわからない。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

デバッグ

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

メモリリーク

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

C++

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

1回答

0グッド

0クリップ

4668閲覧

投稿2021/06/09 04:11

編集2021/06/09 06:43

提示画像ですがGLSLシェーダーを用いたプログラムを作成していると以下のようなエラーがプログラムを終了すると発生ます。これはどいったことが原因として挙げられるのでしょうか?何回かに一回は普通に実行できるのですがたまにこいったエラーが表示されます。調査した結果コンストラクタのこの関数が悪いのですがなぜなのでしょうか?原因がどうしてもわかりません。

エラー原文[CRT detected that the application wrote to memory after end of heap buffer]
google翻訳[ CRT は、アプリケーションがヒープ バッファの終了後にメモリに書き込んだことを検出しました。 ]

イメージ説明

cpp

1 2//コンストラクタ 3FrameWork::Sprite::Sprite(std::shared_ptr<Window> w,const char* vert,const char* frag) : Transform_2D(),Shader() 4{ 5 windowContext = w; //ウインドウコンテキスト 6 7 //シェーダー読み込み 8 if (vert == NULL && frag == NULL) 9 { 10 vert = "Shader/2D/BasicTexture_2D.vert"; 11 frag = "Shader/2D/BasicTexture_2D.frag"; 12 LoadShader(vert, frag); //シェーダーロード 13 14 isDefaultShader = true; 15 } 16 else 17 { 18 std::cout << "個別のシェーダーが読み込まれました。" << std::endl; 19 LoadShader(vert, frag); 20 isDefaultShader = false; 21 } 22 23 //テクスチャ関係 24 textureID = std::vector<TextureData>(0); //テクスチャーデータ 25 textureUnitCount = 0; //テクスチャユニット数をカウント 26 27 //vao 28 glGenVertexArrays(1, &vao); 29 glBindVertexArray(vao); 30 31 //vbo 32 glGenBuffers(1, &vbo); 33 glBindBuffer(GL_ARRAY_BUFFER, vbo); 34 35 //頂点 36 GLint attrib = getAttribLocation("vertexPosition"); 37 glEnableVertexAttribArray(attrib); 38 glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(VertexUV), rectangleVertex, GL_DYNAMIC_DRAW); 39 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(GLfloat), (GLvoid*)0); 40 setBindAttribVertex("vertexPosition"); 41 42 //UV 43 attrib = getAttribLocation("vertexUV"); 44 glEnableVertexAttribArray(attrib); 45 glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(VertexUV), rectangleVertex, GL_DYNAMIC_DRAW); 46 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 5)); 47 setBindAttribVertex("vertexUV"); 48 49 50 //法線 51 attrib = getAttribLocation("vertexNorm"); 52 glEnableVertexAttribArray(attrib); 53 glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(VertexUV), rectangleVertex, GL_DYNAMIC_DRAW); 54 glVertexAttribPointer(attrib, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 3)); 55 setBindAttribVertex("vertexNorm"); 56 57 58 59 60 //アルファブレンド有効 61 glEnable(GL_BLEND); 62 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 63} 64

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2021/06/09 15:14

こちらの質問が複数のユーザーから「過去の低評価」という指摘を受けました。

回答1

3

ベストアンサー

その手のメッセージは、
どこかでアクセス違反(異常アクセス)があったときに出ます。

投稿2021/06/09 04:18

y_waiwai

総合スコア86072

tomy-c, BeatStar👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

2021/06/09 04:23

どういったアクセス違反でしょうか?
y_waiwai

2021/06/09 04:29

それはわかりません。 C/C++では実行時のチェックってのは全く行わないため、メモリ違反があっても検出されません それが出てくるのは、全く別のところでメモリ操作をしようとしたり、今回のように終了処理をしようとしたときに、たまたま検出されるってだけです。 がんばって探そう、としかいいようがないですね
SaitoAtsushi

2021/06/09 07:19

補足。 言語仕様的に言えばメモリアクセスの違反は「未定義の挙動」に該当します。 未定義の挙動というのは前後の状況に関係なくデタラメなことになってもよく、実際に未定義なことをしている箇所のずっと後や前に顕現してもかまわないと解釈されています。 問題が発生した箇所が間違いが含まれる箇所とは限りません。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

OpenGL

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

デバッグ

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

メモリリーク

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

C++

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