2016-12-02 50 views
2

我知道這個問題以前已經問過,但是沒有看到我的問題的適當解決方案,我的問題是當我創建一個指針時一個類(PAGTexture)一切正常,但隨後,該指針作爲變量傳遞給另一個類,並且在該新類(PAGRevolutionObject)中,我從PAGTexture調用一個方法,然後引發異常。調試我意識到它實際上進入該方法,但「this」指針爲空「0x00000000」。 這是我PAGTexture的CPP:當調用該類的一個方法時,指針的類「this」變爲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)); 

} 

它變成一個空指針時,「applyTexture」之稱,因爲它試圖擺脫id_imgs.at(POS)的ID,這一個是空。

這就是我所謂的「applyTexture」部分:

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)); 
    } 
} 

注意紋理是不是空指針,因爲我可以從那裏獲得「applyTexture」。

這是我得到了什麼調試圖像: Image Debugging the process

我也試着設置一個數據斷點知道我的代碼的部分是該指針損壞的以下這"tutorial",但我不能設置斷點爲我的VS版本(VS2015)。老實說,我認爲我的問題是我從另一個班覆蓋記憶(我的學生很大),但即使如此我想問一下,看看有沒有我失蹤的東西。

順便說一句,我在調試模式(不是發佈)使用Visual Studio 2015。

在此先感謝您的任何答案。

EDIT1: 如這裏要求是我定義PAGTexture:

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); 

最後編輯: 謝謝大家的回答,我的問題是,我是結合該指針的內聯函數,似乎你不能這樣做(仍然不知道爲什麼),無論如何,我已經學會了一些觀點,我認爲這可能是重要的,所以再次感謝:D

+3

放在該行斷點和檢查'textures'實際上是不爲空。 –

+3

你沒有清楚你的問題。 [你的代碼片段不能被編譯成可用的可執行文件,所以我們不能重現這個問題。](http://stackoverflow.com/help/mcve)其中一個代碼片段實際上都不包含關鍵字'this'。仍然試圖找出你的問題到底在哪裏...... – DevSolar

+0

我剛剛檢查過,你說得對,紋理爲空,但我仍然可以輸入「applyTexture」方法,這是否合理? – JLentubbi

回答

5

假設:「紋理不是空指針,因爲我可以從那裏訪問」applyTexture「 「。是錯的。 applyTexture不是函數指針,它是一個類方法。

編譯器實際上是你的對象符號呼叫轉換:

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

傳遞nullptr不打擾編譯器一樣的。但是當進入方法時,this==nullptr在訪問成員時崩潰。

它與數據成員不同(可能會立即崩潰),因此您的困惑。

要發揮它的安全,你可以做這樣的事情:

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

將與一個失敗的斷言,如果方法是帶一個空指針(崩潰注:僅在優化被關閉,否則工作編譯器假定與-O1甚至優化的時候this不能nullptr

+0

我不知道,謝謝你的信息,我會再次開始檢查爲什麼紋理是空的。 – JLentubbi

+1

值得一提的是,這是未定義行爲的症狀,不是人們可以依賴的。如果函數是虛擬的(因爲沒有找到vtable),大多數實現也會在調用之前崩潰。 – Quentin

+0

感謝你我終於找到了我爲什麼得到這個錯誤,所以正確的答案是你的。 – JLentubbi

相關問題