2016-07-18 4 views
-4

Я пытаюсь использовать библиотеку SDL2 с C++ и как таковой, некоторым из функций нужен двойной указатель на SDL_Window или SDL_Renderer. Я malloc'ed некоторую память для SDL_Window и дал, что уникальный указатель, как так:Как получить адрес указателя, хранящегося в unique_ptr?

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

и я использовал следующий сайт в качестве руководства для этого: http://www.codeproject.com/Articles/820931/Using-std-unique-ptr-RAII-with-malloc-and-free

Так что теперь мне нужно получить указатель на указатель, хранящийся внутри unique_ptr, но у меня возникли проблемы с этим. Я пытался что-то вроде:

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

Все это привело странные ошибки компилятора, такие как L-значение, необходимое для того одноместной «&» оператора, который является полностью понятным для первых и последних случаях.

Обновления теперь я также использовать сырой 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

Почему вы выделяете объекты SDL_Window с помощью malloc? –

+0

К вопросу Бенджамина я просто понял, что я не занимаюсь распределением памяти; SDL_CreateWindow делает. Я изменил свой код, чтобы отразить это. – user3211355

+0

Да, Hurkyl. Я признаю, что после второго сделать паузу и подумать о функции ха-ха. Я до сих пор не знаю, почему я получаю эту странную ошибку компилятора, хотя, по-видимому, изнутри 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

 Смежные вопросы

  • Нет связанных вопросов^_^