0

SFML で sf::Image のフェード トランジション アニメーションを作成しようとしていますが、小さな問題があります。

以下で呼び出される関数をコメントアウトしないとmain()、画像が分解されているときにエラーが発生します

「Windows がブレークポイントをトリガーしました。これは、ヒープの破損が原因である可能性があります。」

これが発生する行には、コードが含まれていますGLCheck(glDeleteTextures(1, &Texture));

もう 1 つ注意: コメント アウトする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;
}
4

1 に答える 1

0

原因を絞り込むのに役立つ可能性のあるいくつかのこと:

  • プログラムがクラッシュした時点でヒープの破損が発生することはめったになく、プログラムの追跡が困難になります。クラッシュポイントのオブジェクトに関連している可能性があります。または、オブジェクトを破損した別のオブジェクト/コードである可能性があります。
  • CreateTransition()でby値を渡しますが、それanimationArray[]をスレッドプロシージャに渡します。から戻ると、の存続期間はanimationArray[]終了しますCreateTransition()。つまり、この時点以降にスレッドプロシージャが実行されると、そのvoid* ptrパラメータは有効なオブジェクトを指しません。現在のコードにはがありますthread.Wait()が、それを削除することについてのコメントもあります。animationArray[]特別な理由がない限り、参照を渡すか、スレッドプロシージャの一時コピーを作成して、有効なオブジェクトで動作するようにします。
  • std::vector<sf::Image>配列の代わりに使用することを検討してください。
  • とすべての依存クラス(のような)の3つのルールを理解して実装していることを確認してください。これを行わないと、見ているように、ダブルフリー、メモリリーク、およびヒープの破損が発生する可能性があります。sf::imageMyPixels
  • 他のすべてが失敗した場合は、一時的なテストプロジェクトで問題を複製し、可能な限り最小限のコードに減らしてみてください。sf::image問題が解決するまで、一度に1人のメンバーを排除します。同様に、CreateTransition()スレッドプロシージャからの行と他の行を削​​除します。問題を引き起こす非常に具体的な行がいくつかあるか、プロジェクトが空になっています。
于 2011-08-19T01:26:51.683 に答える