为什么我的unique_ptr认为有一个空函数指针删除器?

阿伯施

我正在尝试使用C ++学习SDL。我创建了一个window.h头文件和一个window.cpp用于存储Window类源文件。window.h它看起来是这样的:

Class Window {
public:
  Window();
    . . .
private:
  std::unique_ptr<SDL_Window, void (*)(SDL_Window*)> window;
  std::unique_ptr<SDL_Renderer, void (*)(SDL_Renderer*)> renderer;
    . . .
}

并省略了该类中的某些代码。然后,在我的源文件中,在默认构造函数的定义中,执行以下操作:

Window::Window() {
  window = std::unique_ptr<SDL_Window, void (*)(SDL_Window*)>(nullptr, SDL_DestroyWindow);
  renderer = std::unique_ptr<SDL_Renderer, void (*)(SDL_Renderer*)>(nullptr, SDL_DestroyRenderer);
}

但是,当我进行编译时,系统unique_ptr [is] constructed with null function pointer deleter会告诉我,据我所知这是错误的。也许我误会了如何使用unique_ptr'的删除器,但是我无法弄清楚出了什么问题。有什么我想念的东西吗?或者我完全误解了我在做什么?

莱姆

问题在于,在构造函数中,您对成员使用分配而不是初始化您的成员被隐式默认初始化,这会生成错误。windowrenderer

但是,为什么会这样以及如何更改呢?

如果您不熟悉C ++,这听起来可能有些奇怪,但是评估构造函数的函数体之前,初始化任何类成员默认情况下,每个成员都将使用其默认构造函数进行初始化,或者未进行初始化(如果是类似的原始类型int)。如果要更改此行为(即,如果要使用其他类似的方式对其进行初始化),则必须使用成员初始值设定项列表

例子:

Window::Window() :   // <-- put a colon here
    windows(nullptr, SDL_DestroyWindow),     // here comes the member init list
    rendered(nullptr, SDL_DestroyRenderer)
{
}

注意:从C ++ 11开始,您还可以直接在其定义处初始化成员(例如您可以在Java中进行初始化),但是在您的情况下,这会使标头看起来过于复杂。另外,这也不适合封装规则(在大多数情况下,只有类实现才知道如何处理私有成员)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从指针创建一个unique_ptr

为什么我的unique_ptr立即删除自己?

如果A有析构函数,std :: unique_ptr <A>什么时候需要特殊的删除器?

使用另一个指针在一个“ unique_ptr”拥有的对象上调用“ delete”

Typedef一个带有静态自定义删除器的shared_ptr类型,类似于unique_ptr

为什么我的gcc允许此空函数具有指针返回类型?

指向重载静态成员的函数指针 - 在 unique_ptr 中用作自定义删除器

为什么编译器认为这是一个函数?

为什么std :: unique_ptr构造函数接受外部指针

为什么std :: unique_ptr构造函数接受外部指针?

为什么ssh会认为有密码短语?

为什么SELECT *被认为有害?

为什么不能制作一个包含元组和unique_ptr的元组作为C ++中的值?

指向unique_ptr的指针-这是一个漏洞吗?

具有自定义删除器的unique_ptr构造函数被删除

当我增加一个指针然后删除它时,为什么我的程序崩溃?

删除函数unique_ptr

为什么带有shared_ptr的带有自定义删除器的unique_ptr不适用于nullptr?

为什么我不能为函数指针分配一个函数?

为什么unique_ptr的auto_ptr有重载?

为什么我会得到编译错误“使用删除的功能'std :: unique_ptr ...”

为什么shared_ptr仅使用一个时,unique_ptr会使用两个模板参数?

Pimpl with unique_ptr:为什么我必须将接口的构造函数定义移至“ .cpp”?

为什么我不能分配一个函数指针变量来指向一个特定的函数。错误如下

为什么unique_ptr :: reset在替换后删除对象

为什么不能用reset()删除unique_ptr <char []>?

如何使用删除器调用unique_ptr构造函数?

为什么unique_ptr具有nullptr_t构造函数?

为什么在使用unique_ptr时没有调用析构函数?