2016-12-02 13 views
2

私はこの質問が以前に尋ねられたが、私の問題に適切な解決策を見てdidntを知っている、私の問題は、クラス(PAGTexture)はすべて正常ですが、そのポインタは変数として別のクラスに渡され、その新しいクラス(PAGRevolutionObject)ではPAGTextureからメソッドが呼び出され、例外がスローされます。デバッグ私はそれが実際にそのメソッドに入っていることに気づいたが、 "this"ポインタはnull "0x00000000"です。 これはPAGTextureの私のcppです:ポインタこのクラスのメソッドを呼び出すときにnullになるこのクラスのメソッドを呼び出すときC++

#include "PAGTexture.h" 

PAGTexture::PAGTexture() 
{} 

PAGTexture::~PAGTexture() 
{ 
} 

void PAGTexture::loadTexture(char * path_img, GLuint min_filter, GLuint mag_filter) 
{ 
    int imgWidth, imgHeight; 
    unsigned char *image; 
    image = SOIL_load_image(path_img, 
     &imgWidth, 
     &imgHeight, 
     0, 
     SOIL_LOAD_RGBA); 
    if (imgWidth == 0) { 
     std::cout << "Failed to load image." << std::endl; 
    } 
    GLuint id_img; 
    glGenTextures(1, &id_img); 
    glBindTexture(GL_TEXTURE_2D, id_img); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imgWidth, imgHeight, 
     0, GL_RGBA, GL_UNSIGNED_BYTE, image); 
    glGenerateMipmap(GL_TEXTURE_2D); 
    ep = id_img; 
    id_imgs.push_back(id_img); 
    SOIL_free_image_data(image); 
} 

void PAGTexture::applyTexture(GLuint id, int pos) 
{ 
    glActiveTexture(id); 

    glBindTexture(GL_TEXTURE_2D, id_imgs.at(pos)); 

} 

それはid_imgs.at(POS)からIDを取得しようとすると、この1つがnullであるため、「applyTexture」が呼び出されたときにそれがNULLポインタに変わります。

そして、これは私が「applyTexture」と呼ばれる部分である:私はそこから「applyTexture」にアクセスすることができますので、テクスチャがNULLポインタではないことを

GLuint t = 33984; 
if (id_revol.size() != 0) { 
    for (int i = 0; i < id_revol.size(); i++) { 
     shader_used->setUniform("TexSamplerColor", i); 
     textures->applyTexture(t + i, id_revol.at(i)); 
    } 
} 

はお知らせ。

そして、これは私がデバッグ得たもののイメージである:私もそのポインタをしている私のコードのどの部分を知っているデータブレークポイントを設定しようとしました Image Debugging the process

この"tutorial"次壊れしかし、私はそのブレークポイントを設定しカント私のVSバージョン(VS2015)。

正直言って、別のクラス(私のproyectはかなり大きいです)でもメモリを上書きしているのが私の問題だと思います。でも、私は行方不明のものがあるかどうか尋ねたいと思っていました。

ところで私はデバッグモード(リリースではない)でVisual Studio 2015を使用しています。

お返事ありがとうございます。

EDIT1:

PAGTexture *texturesPack = new PAGTexture(); 
texturesPack->loadTexture("Textures/check.png", GL_LINEAR, GL_LINEAR); 
texturesPack->loadTexture("Textures/HeadSpider.png", GL_LINEAR, GL_LINEAR); 
texturesPack->loadTexture("Textures/wood.jpg", GL_LINEAR, GL_LINEAR); 
objeto2->drawLowerBodySpiderAndHead(texturesPack); 

FINAL EDIT::誰もが答える おかげで、私の問題は、私は、インライン関数内でそのポインタを結合して、それはあなたのように見えるということであった ここで要求されたように、私はPAGTextureを定義したところであります私はそれが重要なことができると思ういくつかのポイントを学んだことをもう一度ありがとうD

+3

その行にブレークポイントを置き、 'textures'が実際にはnullでないことを確認します。 –

+3

あなたはあなたの質問を明確にしませんでした。 [コードスニペットを実際の実行可能ファイルにコンパイルすることはできないので、問題を再現することはできません。](http://stackoverflow.com/help/mcve)コードスニペットには、実際にはキーワード「this」が含まれていません。まだ正確にあなたの問題がどこにあるのか把握しようとしています... – DevSolar

+0

私はちょうどそれをチェックして、あなたは正しいですが、テクスチャはnullですが、まだ私は "applyTexture"メソッドに入ることができます、それは意味がありますか? – JLentubbi

答えて

5

仮定: "そこから" applyTexture "にアクセスできるので、テクスチャはnullポインタではありません。 "間違っている。 applyTextureは関数ポインタではなく、クラスメソッドです。まったくのようなコンパイラを気にしませんnullptrを渡す

PAGTexture::applyTexture(textures, t + i, id_revol.at(i)); 

コンパイラは、実際にあなたのオブジェクト表記呼び出しに変換します。しかし、メソッドを入力すると、this==nullptr、メンバーにアクセスするとクラッシュします。

これはデータメンバーとは異なります(おそらく一度にクラッシュしている可能性があります)。

あなたはのようなものを行うことができ、安全なそれを再生するには、次のメソッドはNULLポインタ(で呼び出された場合失敗したアサーションでクラッシュします

void PAGTexture::loadTexture(char * path_img, GLuint min_filter, GLuint mag_filter) 
{ 
    assert(this!=nullptr); 

注:最適化は他に、オフになっている場合にのみ機能しますコンパイラは、-O1であっても、thisnullptrにすることはできません。

+0

のインスタンスを作成している場所を教えてください。情報がありがたいことを知っていませんでした。 – JLentubbi

+1

これは未定義の動作の症状であり、信頼できるものではないことに言及することは重要です。関数が仮想であれば(呼び出し対象のvtableがないため)ほとんどの実装は呼び出しの前に* do *クラッシュします。 – Quentin

+0

あなたのおかげで、なぜ私は正しい答えがあなたのものなのか、なぜ私はそのエラーを受けていたのか分かりました。 – JLentubbi

関連する問題