2011-08-19 40 views
0

所以我想爲SFF中的sf :: Image製作一個淡入淡出的過渡動畫,而且我有一個小問題。解構sf時堆損壞::圖像陣列

當我就不做評論瞭如下調用的函數,我在main()末得到一個錯誤都被解構的圖像時說

「Windows已經引發了斷點,這可能是由於堆的腐敗 「。

發生這種情況就行包含的代碼GLCheck(glDeleteTextures(1, &Texture));
爲什麼會變成這樣發生的,爲什麼CreateTransition()僅運行時?

再一個注意:當我註釋掉aray[I] = aray[0]時,不會發生中斷。
我發佈了下面的函數。

void CreateTransition(sf::Image& start, sf::Image animationArray[numbImgs]){ 
    animationArray[0] = start; 

    void threadFunc(void* imgArray); 
    sf::Thread thread(threadFunc, reinterpret_cast<void*>(animationArray)); 

    thread.Launch(); 
    thread.Wait();  // comment this out once I get the code working 
} 

void threadFunc(void* ptr){ 
    sf::Image* aray = reinterpret_cast<sf::Image*> (ptr); 

    sf::Color filter(0, 0, 0, 5); 

    for(int I= 1; I< numbImgs; I++){ 
     //aray[I].Copy(aray[0], 0, 0, sf::IntRect(0, 0, 0, 0), true); 
     aray[I] = aray[0]; // error doesn't occur when commented out 
     RecolorImage(aray[I], filter); 
    } 
} 

Image& Image::operator =(const Image& Other) 
{ 
    Image Temp(Other); 

    std::swap(myWidth,    Temp.myWidth); 
    std::swap(myHeight,   Temp.myHeight); 
    std::swap(myTextureWidth,  Temp.myTextureWidth); 
    std::swap(myTextureHeight,  Temp.myTextureHeight); 
    std::swap(myTexture,   Temp.myTexture); 
    std::swap(myIsSmooth,   Temp.myIsSmooth); 
    std::swap(myNeedArrayUpdate, Temp.myNeedArrayUpdate); 
    std::swap(myNeedTextureUpdate, Temp.myNeedTextureUpdate); 
    myPixels.swap(Temp.myPixels); 

    return *this; 
} 

回答

0

有幾件事情可能幫助你縮小的原因:

  • 堆損壞很少發生在點時的程序崩潰,這使得他們很難追查。它可能與崩潰點處的對象有關,或者它可能是另一個破壞它的對象/代碼。
  • CreateTransition()中,您按值通過animationArray[],但您將其傳遞給線程過程。 animationArray[]的生存期從CreateTransition()返回時結束,這意味着如果線程過程在此點之後運行,則其void* ptr參數不會指向有效的對象。你在當前的代碼中有一個thread.Wait(),但也有關於刪除它的評論。通過引用可以傳遞animationArray[],除非存在特定的原因,或者爲線程過程創建臨時副本以確保其在有效對象上運行。請考慮使用std::vector<sf::Image>而不是數組。
  • 確保您瞭解並實施Rule of Threesf::image和任何相關類(如MyPixels)。不這樣做可能會導致雙重釋放,泄漏內存和像您所看到的堆損壞。
  • 如果一切都失敗,請嘗試在臨時測試項目中複製問題並將其減少到可能的最小代碼量。一次消除sf::image的成員,直到問題消失。同樣,從線程程序中刪除CreateTransition()和其他行中的行。你最終會得到一些觸發問題的非常具體的行或者一個空的項目。