我正在使用GLFW来处理应用程序中的窗口事件。它工作正常。后来我决定从GLFWwindow开始删除原始指针。它在文件glfw3.h中定义为:
3
我无法在头文件中找到结构的实际定义。所以我认为这是一种前瞻性声明,但我不知道为什么它不像
typedef struct GLFWwindow GLFWwindow;
我尝试使用后一种形式的前向声明来替换前一种形式。它汇编得很好。前者形成前瞻性宣言的亲是什么?
所以真正的问题,由于结构GLFWwindow只是一个声明,唯一指针无法完成模板专业化而无需定义。我不能使用unique_ptr来声明任何指针。编译器给我错误struct GLWwindow;
任何人都知道如何使用GLFWwindow的唯一指针?
由于
答案 0 :(得分:7)
您需要将Deleter提供给唯一的ptr:
struct DestroyglfwWin{
void operator()(GLFWwindow* ptr){
glfwDestroyWindow(ptr);
}
}
std::unique_ptr<GLFWwindow, DestroyglfwWin> my_window;
使用typedefed智能指针非常方便。
typedef std::unique_ptr<GLFWwindow, DestroyglfwWin> smart_GLFWwindow;
smart_GLFWwindow my_window;
答案 1 :(得分:5)
您可以使用自定义删除工具。
std::unique_ptr<GLFWwindow, glfwDestroyWindow>
答案 2 :(得分:5)
但我不知道为什么它不像......
那是因为GLFW是用C而不是C ++编写的。这两个是完全不同的语言,其中有一些重叠,其中声明有效,但即便如此,也有很大差异,正如你所见。
在C struct
和enum
中,每个都位于自己的标记命名空间中,您必须明确地将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
实际上是默认的所有公共class
es,因此构造函数/析构函数语义按预期工作。但在普通的C中,结构只是简单的记忆。所以unique_ptr
的语义并不真正适用。你需要一些辅助类,它增强了构造函数/析构函数的语义。请参阅ratchet_freak的答案。