将unique_ptr与GLFWwindow一起使用

r0n*_*0ng 3 c++ opengl glfw

我正在使用GLFW来处理应用程序中的窗口事件.它工作正常.后来我决定从GLFWwindow开始删除原始指针.它在文件glfw3.h中定义为:

typedef struct GLFWwindow GLFWwindow; 
Run Code Online (Sandbox Code Playgroud)

而且我在头文件中找不到结构的实际定义.所以我认为这是一种前瞻性声明,但我不知道为什么它不喜欢

struct GLWwindow;
Run Code Online (Sandbox Code Playgroud)

我试图使用后面的前向声明形式来替换前一种形式.它汇编很好.前者形成前沿宣言的亲是什么?

所以真正的问题,由于GLFWwindow结构只是一个声明,唯一指针无法完成模板专业化而无需定义.我不能使用unique_ptr来声明任何指针.编译器给我错误

C2027 use of undefined type 'GLFWwindow'
C2338 can't delete an incomplete type
C4150 deletion of pointer to incomplete type 'GLFWwindow';no destructor called
Run Code Online (Sandbox Code Playgroud)

任何人都知道如何使用GLFWwindow的唯一指针?

谢谢

rat*_*eak 8

您需要将Deleter提供给唯一的ptr:

struct DestroyglfwWin{

    void operator()(GLFWwindow* ptr){
         glfwDestroyWindow(ptr);
    }

}

std::unique_ptr<GLFWwindow, DestroyglfwWin> my_window;
Run Code Online (Sandbox Code Playgroud)

使用typedefed智能指针非常方便.

typedef std::unique_ptr<GLFWwindow, DestroyglfwWin> smart_GLFWwindow;

smart_GLFWwindow my_window;
Run Code Online (Sandbox Code Playgroud)


mol*_*ilo 5

您可以使用自定义删除器.

std::unique_ptr<GLFWwindow, glfwDestroyWindow>
Run Code Online (Sandbox Code Playgroud)


dat*_*olf 5

但我不知道为什么它不像……

那是因为GLFW是用C而不是C ++编写的。这两种语言是完全不同的语言,声明的工作方式有些重叠,但是正如您所看到的,即使有很大的不同。

在C structenumS中,每个都有自己的标签命名空间,您必须显式编写struct name_of_the_struct …enum name_of_the_enum …使用它。通过声明此类型定义,typedef struct … …可以将结构拉入常规变量并键入名称空间。有一些顽固的C程序员(包括我在内)认为不应这样做。如果您正在编写C ++,则是在编写C ++,如果您正在编写C,则是在编写C,那么就没有将两者混在一起的危险。

前向申报的形成的优点是什么?

编写C时节省了一些击键。就是这样……

因此,真正的问题是,由于GLFWwindow结构只是一个声明,如果没有定义,唯一指针就无法完成模板的专门化。我不能使用unique_ptr声明任何指针。

还有更多的unique_ptr不仅仅是具有结构定义。A unique_ptr(我强调):

std :: unique_ptr是一个智能指针,它通过指针保留对象的唯一所有权,在unique_ptr超出范围时销毁该对象。没有两个unique_ptr实例可以管理同一对象。

破坏发生delete在对象上,而对象又调用了析构函数。在C ++ struct中,实际上是默认情况下的所有public,class因此构造函数/析构函数的语义可以按预期运行。但是在普通C语言中,一个结构只是普通内存。因此,a的语义unique_ptr并不真正适用。您需要一些辅助类,以增强构造函数/析构函数的语义。参见ratchet_freak的答案。