2016-12-22 1 views
-2

LazyFoo의 멋진 튜토리얼 (http://lazyfoo.net/tutorials/SDL/10_color_keying/index.php)을 기반으로하는 간단한 색상 키 엔진 예제를 구현하려고하지만 실행하려고하면 EXC_BAD_ACCESS (코드 = 1, address = 0x0) 포인터가 null인지 여부를 테스트하려고한다는 사실에도 불구하고. 여기NULL을 확인하려고 할 때 EXC_BAD_ACCESS

//Texture wrapper class 
class LTexture 
{ 
public: 
    //Initializes variables 
    LTexture(); 
    //Deallocates memory 
    ~LTexture(); 
    //Loads image at specified path 
    bool loadFromFile(std::string path); 
    //Deallocates texture 
    void free(); 
    //Renders a texture at a given point 
    void render(int x, int y); 
    //Gets an image's dimensions 
    int getWidth(); 
    int getHeight(); 
private: 
    //The actual hardware texture 
    SDL_Texture* mTexture = NULL; 
    //Image dimensions 
    int mWidth; 
    int mHeight; 
}; 

및 초기화하기가 그리고 방법을 파괴 :

LTexture::LTexture() 
{ 
    //Initialize 
    mTexture = NULL; 
    mWidth = 0; 
    mHeight = 0; 
    printf("I initialized"); 
} 

LTexture::~LTexture() 
{ 
    free(); 
} 

을 그리고 내 오류가 LTexture::free 방법에있다 여기에 클래스의 모습입니다. 내가 테스트 할 때 mTexture 내가 유효한다고 생각하는 NULL이지만, 어떤 이유로 그렇지 않은 경우

void LTexture::free() 
{ 
    //Free texture if it exists 
    if (mTexture != NULL) //HERE IS THE ISSUE. WHAT IS WRONG WITH THIS? 
    { 
     SDL_DestroyTexture(mTexture); 
     mTexture = NULL; 
     mWidth = 0; 
     mHeight = 0; 
    } 
} 

당신이 온라인에서 볼 수 있듯이

는 문제가 나타납니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 코드 도움이 더 많이 게시됩니까?

+0

예, 그렇습니다. 아마도 주위에 텍스처를 복사하고 있지만 코드가 올바르게 처리하지 못합니다. – user3684240

+0

나는 이해하지 못한다 ... 어디에서 텍스처를 복사하고 싶습니까? 나는 텍스처가 복사되었는지 아닌지 free()가 신경 쓰지 않을 것이라고 생각했다. – WulffHunter

+1

그건 그가 의미하는 것이 아닙니다. 1.'LTexture (const LTexture &) = delete;'를 클래스 정의에 넣으십시오. 2. 컴파일하면 개체 클래스의 인스턴스를 복사하는 위치가 곧 보입니다 (더 이상 수행 할 수 없기 때문입니다). 자세한 내용은 [Three of Rule] (https://en.wikipedia.org/wiki/Rule_of_three_ (C % 2B % 2B_programming))을 참조하십시오. – WhozCraig

답변

0

아마도 복사 및 이동을 제대로 처리하지 못하는 것일 수 있습니다.

LTexture을 복사 할 때마다 포인터 만 복사됩니다. 복사본이 범위를 벗어나면 소멸자가 호출됩니다. 그런 다음 원본이 범위를 벗어나서 소멸자가 동일한 포인터에서 다시 호출되어 이중 해제가 발생합니다.

나는 스마트 포인터를 사용하는 것이 좋습니다 것입니다 :

#include <memory> 
class TextureDeleter { void operator()(SDL_Texture* t) { SDL_DestroyTexture(t); }; 

// in the class 
std::unique_ptr<SDL_Texture, TextureDeleter> mTexture; 

당신은 다음 소멸자를 삭제할 수 있습니다.

편집 : 당신이 정말<memory>를 사용하지 않는 경우에, 당신은 당신의 클래스에

LTexture(const LTexture &) = delete; 
LTexture& operator=(const LTexture &) = delete; 
LTexture(LTexture &&) = delete; 
LTexture& operator=(LTexture &&) = delete; 

을 추가하여 안전의 같은 종류를 얻을 수 있습니다.

그러나 주석에서 지적한 것처럼 이것은 실제로 클래스를 이동하거나 복사 할 필요가없는 경우에만 작동합니다. 그렇게한다면 shared_ptr을 사용해야하는데, 이는 자신을 만드는 것이 중요하지 않습니다.

+0

참고 : 구성원이'std :: unique_ptr' 인 경우 사용자 지정 copy-ctor 준비가 없으면 복사가 허용되지 않습니다.여러 인스턴스가 동일한 SDL_Texture를 * 공유 *해야한다면 공유 포인터가 적합 할 수 있습니다. – WhozCraig

+0

다른 헤더를'# include '하지 않고이 문제를 해결할 수있는 방법이 있습니까? 내가 이미 쓴 것들을 사용해서? 내가 LazyFoo의 원래 예제에서 너무 멀리 벗어나려고 노력하고있어 ... – WulffHunter

+0

나는 게시물을 업데이 트했습니다. – user3684240

관련 문제