如何获取存储在unique_ptr中的指针的地址?

use*_*355 -3 c++ pointers unique-ptr

我正在尝试使用带有c ++的SDL2库,因此,某些函数需要一个指向SDL_Window或SDL_Renderer的双指针.我为一个SDL_Window设置了一些内存并将其赋予一个如此独特的指针:

window = unique_ptr<SDL_Window, decltype(free) *>
    reinterpret_cast<SDL_Window *>(malloc(sizeof(SDL_Window))),
    free};
Run Code Online (Sandbox Code Playgroud)

我使用以下网站作为指南: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())))
Run Code Online (Sandbox Code Playgroud)

所有这些都导致奇怪的编译器错误,例如一元'&'运算符需要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);
Run Code Online (Sandbox Code Playgroud)

但现在,我正在运行此编译器错误:

/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());
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 6

你无法获得存储在指针内的指针的地址std::unique_ptr.如果你需要调用通过双指针返回指针的C代码,你需要传递一些其他指针的地址,然后单独拥有该std::unique_ptr指针的取得所有权.如果std::unique_ptr允许您直接写入存储的指针,则无法释放先前保存的资源.

  • 所有这些都可以包含在一个漂亮的类中:http://ideone.com/uBlJzw (3认同)
  • @GabrielStaples 不,`.get()` 告诉你指针的*值*。存储在“std::unique_ptr&lt;T&gt;”内的指针的地址将具有“T**”类型——指向指针本身的指针。 (2认同)
  • 啊,对了,我明白了。你并不是说你无法获取`unique_ptr`指向的_object_的地址(即:指针的值,这是`.get()`提供的),你是说你不能获取`unique_ptr`内部_pointer_的地址,该地址存储`unique_ptr`指向的对象的地址。因为如果您_可以_获得指针本身的地址,那么您就可以_操纵或更改它_,从而侵犯“unique_ptr”对该指针的所有权。 (2认同)