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

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

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

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

デバッグ

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

メモリリーク

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

C++

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

Q&A

解決済

1回答

7898閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

デバッグ

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

メモリリーク

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

C++

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

0グッド

1クリップ

投稿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

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

投稿2021/06/09 04:18

y_waiwai

総合スコア87987

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

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

退会済みユーザー

退会済みユーザー

2021/06/09 04:23

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

2021/06/09 04:29

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

2021/06/09 07:19

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問