повреждение кучи при деконструкции массива sf :: Image - PullRequest
0 голосов
/ 19 августа 2011

, поэтому я пытаюсь создать анимацию переходного затухания для sf :: Image в SFML, и у меня небольшая проблема.

Когда я не закомментирую функцию, вызванную ниже, я получаю сообщение об ошибке в конце 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;
}

1 Ответ

0 голосов
/ 19 августа 2011

Несколько вещей, которые могут помочь вам сузить причину:

  • Повреждение кучи редко происходит в тот момент, когда происходит сбой программы, что затрудняет их поиск.Это может быть связано с объектом в точке сбоя, или это был другой объект / код, который его испортил.
  • В CreateTransition() вы передаете значение animationArray[] по значению, но затем передаете его в потокпроцедура.Время жизни animationArray[] заканчивается, когда вы возвращаетесь из CreateTransition(), что означает, что если процедура потока выполняется после этой точки, ее параметр void* ptr не будет указывать на допустимый объект.У вас есть thread.Wait() в текущем коде, но также есть комментарий об его удалении.Либо передайте animationArray[] по ссылке, если только для этого нет особой причины, либо создайте временную копию для процедуры потока, чтобы убедиться, что она работает с допустимыми объектами.
  • Попробуйте использовать std::vector<sf::Image> вместо массива.
  • Убедитесь, что вы понимаете и реализуете Правило трех для sf::image и любых зависимых классов (например, MyPixels).Невыполнение этого может привести к двойному освобождению, утечке памяти и повреждению кучи, как вы видите.
  • Если ничего не помогает, попробуйте продублировать проблему во временном тестовом проекте и уменьшить ее до минимального количества кода.возможный.Избавьтесь от членов sf::image по одному, пока проблема не исчезнет.Точно так же удалите строки из CreateTransition() и другие строки из процедуры потока.Вы либо получите несколько очень специфических строк, вызывающих проблему, либо пустой проект.
...