2011-08-19 1 views
0

을 해체, 나는 작은 문제가있을 때. 나는 아래라는 기능을 언급하지 않을 경우 이미지가힙 손상 그래서 SFML에서 페이드 전이 SF에 대한 애니메이션 :: 이미지를 만들기 위해 노력하고있어 김포 :: 이미지 배열

은 "Windows가 중단 점을 트리거하고있다 .이있을 수 있습니다 인해 말을 해체 될 때

, 나는 main()의 말에 오류가 힙의 손상 . "

이가 일어나는 줄은
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>을 사용하는 것이 좋습니다.
  • 은 이해 확인하고 sf::image에 대한 Rule of Three와 종속 클래스를 (같은 MyPixels) 구현합니다. 이 작업을 수행하지 않으면 이중 해제, 누수 된 메모리 및 힙 손상이 나타날 수 있습니다.
  • 그 밖의 모든 것이 실패하면 임시 테스트 프로젝트에서 이슈를 복제하고 가능한 한 가장 적은 코드로 줄이십시오. 문제가 없어 질 때까지 한 번에 하나씩 sf::image 명의 회원을 제거하십시오. 마찬가지로 CreateTransition() 및 스레드 프로 시저의 다른 줄에서 줄을 삭제하십시오. 문제를 유발하는 매우 구체적인 몇 줄 또는 빈 프로젝트로 끝나게됩니다.