0

所以我正在尝试为 SFML 中的 sf::Image 制作淡入淡出过渡动画,但我遇到了一个小问题。

当我不注释掉下面调用的函数时,我在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;
}
4

1 回答 1

0

一些可以帮助您缩小原因的事情:

  • 程序崩溃时很少发生堆损坏,这使得它们难以追踪。它可能与崩溃点的对象有关,或者可能是另一个损坏它的对象/代码。
  • CreateTransition()您传递animationArray[]值时,然后将其传递给线程过程。animationArray[]返回时结束的生命周期,CreateTransition()这意味着如果线程过程在此点之后运行,其void* ptr参数将不会指向有效对象。您在当前代码中确实有一个thread.Wait(),但也有关于删除它的评论。animationArray[]除非有特定原因,否则通过引用传递,或者为线程过程创建一个临时副本以确保它在有效对象上运行。
  • 考虑使用 astd::vector<sf::Image>而不是数组。
  • 确保您了解并实施三原则以及sf::image任何依赖类(如MyPixels)。不这样做会导致双重释放、内存泄漏和堆损坏,就像您看到的那样。
  • 如果一切都失败了,请尝试在临时测试项目中复制问题并将其减少到尽可能少的代码量。一次消除一个成员,sf::image直到问题消失。CreateTransition()同样,从线程过程中删除行和其他行。您最终会得到一些触发问题的非常具体的行或一个空项目。
于 2011-08-19T01:26:51.683 回答