C++ 如何获取存储在唯一\u ptr中的指针地址?

C++ 如何获取存储在唯一\u ptr中的指针地址?,c++,pointers,unique-ptr,C++,Pointers,Unique Ptr,我尝试使用C++的SDL2库,因此,一些函数需要双指针到SDLYLIVER或SDLL渲染器。我为SDL_窗口分配了一些内存,并将其分配给一个唯一的指针,如下所示: window = unique_ptr<SDL_Window, decltype(free) *> reinterpret_cast<SDL_Window *>(malloc(sizeof(SDL_Window))), free}; 所有这些都导致了奇怪的编译器错误,比如一元“&”运算符需要一

我尝试使用C++的SDL2库,因此,一些函数需要双指针到SDLYLIVER或SDLL渲染器。我为SDL_窗口分配了一些内存,并将其分配给一个唯一的指针,如下所示:

window = unique_ptr<SDL_Window, decltype(free) *>
    reinterpret_cast<SDL_Window *>(malloc(sizeof(SDL_Window))),
    free};
所有这些都导致了奇怪的编译器错误,比如一元“&”运算符需要一个l值,这在第一种和最后一种情况下是完全可以理解的

更新 我现在还使用一个原始SDL_窗口*来获取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());

无法获取存储在std::unique\u ptr中的指针地址。如果需要调用通过双指针返回指针的C代码,则需要将其他指针的地址传递给它,然后分别让std::unique_ptr拥有该指针的所有权。如果std::unique\u ptr允许您直接写入存储的指针,那么它将无法释放它以前持有的资源。

通常,当您陷入这样的问题时,这是一个很大的线索,表明您做错了

例如,为什么需要SDL_窗口**?例如,是不是因为您正在调用SDL_CreateWindowandRender,这是一个创建窗口的函数?这与您已经创建了一个窗口对象并且似乎打算使用它的事实相冲突

简单地浏览一下API,目的似乎是SDL_窗口对象不是您创建的东西——它们是库创建的东西

e、 你真正想做的事情是什么

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

unique_ptr是一个更简单的stl类-您可以重新实现它并添加一个方法来访问其中的指针

下面的代码是一个未定义的行为类别丑陋的黑客,但它实际上在GCC中使用coliru在线编译器进行测试,代码段如下:

std::unique_ptr<myclass> uptr;
//Warning, undefined behavior!
myclass*& inside = *reinterpret_cast<myclass**>(&uptr);
用于验证的小型测试程序:

#include <iostream>
#include <memory>

class myclass {
public:
    myclass() {
    }
    ~myclass() {
        std::cout << "It works!\n";
    }
};

int main()
{

    std::unique_ptr<myclass> uptr;
    //Warning, undefined behavior!
    myclass*& inside = *reinterpret_cast<myclass**>(&uptr);
    //Warning, undefined behavior!
    inside = new myclass();

    return 0;
}

为什么要用malloc分配SDL_窗口对象?对于Benjamin的问题,我刚刚意识到我不做内存分配;SDL_CreateWindow可以。我修改了代码来反映这一点。是的,赫斯基。我意识到,在花了一秒钟的时间停下来思考函数后,哈哈。我仍然不知道为什么会出现这种奇怪的编译器错误,似乎是从unique_ptr.hb内部出现的,但我不是那个试图调用该操作符的人。它说unique_ptr.h正在尝试。你的更新基本上是一个完全不同的问题。请给每篇文章一个问题。所有这些问题都可以用一个漂亮的类来包装:@Brian,你说你无法获取存储在std::unique\u ptr中的指针地址是什么意思?这不就是指针的作用吗?@GabrielStaples不,.get告诉你指针的值。存储在std::unique_ptr中的指针地址的类型是T**——指向指针本身的指针。啊,对了,我知道了。你不是说你不能获得unique_ptr指向的对象的地址,即:指针的值,这是.get提供的,你是说你不能在unique_ptr内获得指针的地址,unique_ptr存储unique_ptr指向的对象的地址。因为如果您可以获取指针本身的地址,那么您就可以对其进行操作或更改,从而侵犯了unique_ptr对该指针的所有权。例如,为什么您需要SDL_窗口*…*——API需要它。你真正想做的是…-你如何让库的作者修改他们的代码?如果我在代码审查中发现了这一点,我将和那个开发人员聊天。那个开发人员意识到这段代码是危险的。他可以通过编写ifdefgnuc甚至围绕它的版本来保护自己的屁股,使其仅在检查了标准头的GCC上编译。你是否允许重新解释演员阵容?有人能提供一个这样做/不这样做的情况的概述吗?
#include <iostream>
#include <memory>

class myclass {
public:
    myclass() {
    }
    ~myclass() {
        std::cout << "It works!\n";
    }
};

int main()
{

    std::unique_ptr<myclass> uptr;
    //Warning, undefined behavior!
    myclass*& inside = *reinterpret_cast<myclass**>(&uptr);
    //Warning, undefined behavior!
    inside = new myclass();

    return 0;
}