2016-07-18 2 views
-4

C++에서 SDL2 라이브러리를 사용하려고하므로 일부 함수에는 SDL_Window 또는 SDL_Renderer에 대한 이중 포인터가 필요합니다. 나는 SDL_Window에 대한 일부 메모리를 malloc으로 할당 한 고유 포인터과 같이 있음을 주었다했습니다 http://www.codeproject.com/Articles/820931/Using-std-unique-ptr-RAII-with-malloc-and-freeunique_ptr에 저장된 포인터의 주소를 얻는 방법은 무엇입니까?

그래서 지금은 필요 :

window = unique_ptr<SDL_Window, decltype(free) *> 
    reinterpret_cast<SDL_Window *>(malloc(sizeof(SDL_Window))), 
    free}; 

나는 그 때 다음 사이트를 사용 unique_ptr 내부에 저장된 포인터에 대한 포인터를 얻지 만 그렇게하는 데 문제가 있습니다. 내가 좋아하는 일을 시도했다 :

&window.get() 
// or 
&&(*window) 
// or 
&window 
// and even 
&(&(*(window.get()))) 

좌변 값과 같은 이상한 컴파일러 오류 결과이 모든

는 처음과 마지막의 경우 전적으로 이해할 수있다 단항 '&'연산자에 대한 요구된다.

업데이트 이제도의 주소를 얻기 위해 * 원시 SDL_Window를 사용하고 unique_ptr을 제공 할 수 있습니다. 내 코드 조각의 일부 (문맥하지만) :

SDL_Window *window_ptr; 
unique_ptr<SDL_Window> window; 

window = unique_ptr<SDL_Window, decltype(SDL_DestroyWindow)> (
    window_ptr, 
    SDL_DestroyWindow); 

SDL_CreateWindowAndRenderer(500, 500, SDL_WINDOW_SHOWN, &window_ptr, &renderer_ptr); 

하지만 지금,이 컴파일러 오류를 실행 해요 :

/usr/include/c++/5/bits/unique_ptr.h:272:18: error: no match for ‘operator=’ 
(operand types are ‘std::unique_ptr<SDL_Window>::deleter_type 
{aka std::default_delete<SDL_Window>}’ and ‘void (*)(void*)’) 
get_deleter() = std::forward<_Ep>(__u.get_deleter()); 
+2

왜 malloc을 사용하여 SDL_Window 객체를 할당하고 있습니까? –

+0

벤자민의 질문에 나는 방금 메모리 할당을하지 않는다는 것을 깨달았다. SDL_CreateWindow는 않습니다. 이를 반영하도록 코드를 수정했습니다. – user3211355

+0

예, 허 키릴. 나는 잠시 멈추고 그 기능에 대해 생각해 본 후 그것을 인식한다. 아직도 이상한 컴파일러 오류가 발생하는 이유는 모르겠지만, 겉으로보기에는 unique_ptr.h 내부에서 발생합니다. – user3211355

답변

3

당신은 std::unique_ptr 내부에 저장된 포인터의 주소를 얻을 수 없습니다. 이중 포인터를 통해 포인터를 반환하는 C 코드를 호출해야하는 경우 다른 포인터의 주소를 전달한 다음 std::unique_ptr 포인터의 소유권을 가져야합니다. std::unique_ptr에 저장된 포인터에 직접 쓸 수 있으면 이전에 보유한 리소스를 해제 할 방법이 없습니다.

+1

모두 예쁜 클래스로 래핑 될 수 있습니다 : http://ideone.com/uBlJzw –

3

자주 묻는 질문에 답을 얻으려면 을 잘못 쓰고 있다는 큰 단서가 있습니다..

예를 들어 SDL_Window**이 필요한 이유는 무엇입니까? 예를 들어, SDL_CreateWindowAndRenderer, 이라는 함수를 호출하면 창이 생성 되었습니까? 이는 당신이 이미 창 객체를 만들었고, 그것을 사용하려고하는 것처럼 보이는 것과 충돌합니다. 이 API에 간단하게 감추고

, 의도는 SDL_Window 객체는 —을 만들하지 것을 그들은 라이브러리가 생성하는 것들이라는 것을 보인다.

당신이 정말로하고 싶은 것은 lke입니다.

SDL_Window *window_; 
SDL_Renderer *renderer_; 
SDL_CreateWindowAndRenderer (/* ... */, &window_, &renderer_); 
unique_ptr<SDL_Window, decltype(&SDL_DestroyWindow)> 
    window(window_, &SDL_DestroyWindow); 
+0

* "예를 들어, 왜 SDL_Window가 필요합니까 **"... * - API가 요구합니다. * "정말로하고 싶은 일은 ..."- 도서관의 저자에게 코드를 어떻게 변경 시키게합니까? – jww

관련 문제