2016-07-01 4 views
0

리소스 로더와 관리자를 작성하려고합니다. (예, 내가 "토르"에 대해 알고있는 "학습"프로젝트입니다.) 그리고 나는 뭔가 조합이 아닌 노동 조합을 실험하기 시작했습니다. 나는 아주 자주 사용한다. 나는 texture/font를 포함하는 union을 가진 resource라는 클래스를 생성했다. 텍스처가 올바르게로드됩니다. 그러나 글꼴이 액세스 위반을 throw합니다.SFML의 글꼴에 대한 리소스 조합이 액세스 위반을 throw합니다.

Exception thrown at 0x00C5DBE0 in Project.exe: 0xC0000005: Access violation reading location 0x00000004. 

다음은 저의 완전한 예입니다. EDIT :: 업데이트 된 코드는 문제를 해결합니다. Evan은 노조의 첫 번째 요소 만 기본 구성되기 때문에 이것이 아래에 설명했습니다.

#include <SFML/Graphics.hpp> 

class Resource 
{ 
public: 
    union 
    { 
     sf::Texture t; 
     sf::Font f; 
    }; 

    Resource(sf::Font font = sf::Font()) : f(font) 
    {           } 

    ~Resource() 
    {   } 
}; 

int main() 
{ 
    Resource font; 
    Resource tex; 

    if (!tex.t.loadFromFile("player.png")) {} //! Works great! 
     //doError 

    if (!font.f.loadFromFile("blocks.ttf")) {} //! Throws access violation. 
     //doError 

    return 0; 
} 
+0

과 같이 수동으로 수행해야합니다 : Texture와 sf :: Font는 어떤 일이 일어나고 있는지를 말하기는 불가능하지만, f가 제대로 구축되지 않았다고 생각합니다. – evan

+0

그 중 일부는 SFML 라이브러리입니다. 위에 설명한 것처럼 실제로는 기본 생성자를 사용하여 생성 할 수 있습니다. – Reborn

+0

문제가 SFML 수업인지 또는 문제인지 확인해 보셨습니까? 문제를'string'과'vector'로 구현하려고 시도했는데 문제가있었습니다. stl을 사용하여 문제를 재현 할 수 있다면 더 많은 사람들에게 다가 갈 수 있습니다. –

답변

2

나는 f이 unitialized 인 것으로 추측합니다. union 멤버의 메모리 영역은 중첩되며 그렇지 않으면 컴파일러에게 알리지 않는 한 첫 번째 멤버 만 초기화됩니다.

생성자에서 직접 초기화하거나 새로 배치를 사용하여 초기화 할 수 있습니다.

new (&f) sf::Font; 

또한, 노동 조합을 파괴한다하면 컴파일러가 소멸되는 멤버 모르기 때문에, 문제가 발생할 것입니다, 그리고 SF의 정의없이

f.~sf::Font(); 
+0

'new (& f) sf :: Font;'를 어디에 넣을까요? 생성자 또는 조합 자체에서? 아니면 주요 기능? – Reborn

+1

'main'에서'font.f.loadF ...'앞에'new (& font.f) sf :: Font;를 추가하십시오. – evan