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

2024-02-17

我正在尝试使用 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的删除器,但我不知道出了什么问题。我是否遗漏了什么或者我完全误解了我在做什么?


问题是在你的构造函数中,你使用任务代替初始化为会员window and renderer。您的成员被隐式默认初始化,这会生成错误。

但为什么会这样以及如何改变呢?

如果您是 C++ 新手,这可能听起来有点奇怪,但任何类成员都会被初始化before构造函数体被求值。默认情况下,每个成员都将使用其默认构造函数进行初始化,或者保持未初始化状态(如果它是基本类型,例如int)。如果你想改变这种行为(即,如果你想用不同的东西初始化它,就像你想要的那样),你必须使用成员初始值设定项列表 http://en.cppreference.com/w/cpp/language/initializer_list.

Example:

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

注意:从 C++11 开始,您还可以直接在成员的定义处初始化成员 http://en.cppreference.com/w/cpp/language/data_members#Member_initialization(例如,您可以在 Java 中执行此操作),但在您的情况下,这会使标头看起来太复杂。另外,这不符合封装规则(在大多数情况下,只有类实现应该知道如何处理私有成员)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的 unique_ptr 认为有一个空函数指针删除器? [复制] 的相关文章

随机推荐

  • 屏幕旋转时选项卡更改 [Android]

    您好 我有带有 4 个选项卡的 Android 应用程序 假设 tab1 tab2 tab3 tab4 当活动启动时 默认选项卡是 tab1 当我切换到任何其他选项卡 选项卡 2 选项卡 3 或选项卡 4 并更改屏幕方向时 它总是重置为默认
  • 64 位机器/操作系统上的 32 位操作与 64 位操作

    哪个操作 即 32 位操作或 64 位操作 例如屏蔽 32 位标志或 64 位标志 在 64 位机器上会更便宜 由于您没有指定架构 我只能建议一个一般答案 因为它取决于操作和所讨论的处理器架构 一旦 CPU 寄存器中有数据 大多数操作通常会
  • 2D Python 游戏编程的工具包选项 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将项目从 .NET 4.0 升级到 .NET 4.5 后失败 => 找不到类型或命名空间名称“MaxLength”/“Column”

    我有一个针对 Net 4 0 和实体框架 4 3 1 的工作网站 安装 Net 4 5 使用 Visual Studio Express 2012 后 我可以在 Visual Web Developer Express 2010 上编译网站
  • 将主要参数传递给 gui 库的 init 函数

    当涉及到 Qt 和 GTK 等库中的库初始化时 您必须将主要参数传递到初始化库的函数中 为什么 图书馆用它们做什么 为了方便起见 Qt 和 GTK 都旨在响应某些命令行标志 两者也都响应各种环境变量 您不一定have将 argv 和 arg
  • 简单的 jQuery ajax 问题是否成功返回数据?

    嗨 我有以下内容 ajax type POST url global pathPrefix services brochure asmx ShowPostRequest data parkIds input ids val success
  • wpf使用网格作为itemshost自动将多个项目堆叠在单个“单元格”中

    我将项目控件绑定到数据源并使用网格作为我的项目主机 我希望让这些项目将自己定位到网格中的正确单元格中 我可以做到这一点 并且也将自己堆叠起来 这样它们就不会全部彼此重叠 我不知道如何将这些项目插入到stackpanel 或网格中的其他面板
  • django控制器在views.py中是什么

    我已经遵循了几个 django 教程 我不知道为什么控制器存储在名为views py 的文件中 我对这个文件名感到困惑 我正在寻找 MVC 开发 django 中还有其他用于 真实 控制器的文件吗 名字views py是一个错误 从架构的角
  • 如何在 TypeScript 中声明具有属性的函数的类型?

    我在 TypeScript 网站上阅读了一些文档 但不确定我是否理解正确 在这种情况下 我使用的包没有可用的 TypeScript 类型 prismic reactjs 所以我试图自己声明类型 这样我就可以摆脱困扰我的项目的错误 那么 作为
  • “null this”是否可以接受扩展方法的使用? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 Rails 定期计费 - 我有哪些选择?

    在开始之前 我想知道我的所有选择是什么 如果可能的话 它们的优点和缺点 我知道的两个正在使用 ActiveMerchant 或 paypal recurring gem 但它们会满足这些要求吗 能够适应按月和按年计费 能够暂停 取消帐户等
  • 20 多天后由于碎片而导致 Android 出现内存不足错误

    我制作了一个在咖啡机上运行的应用程序 20 多天后 可能是 60 多天 具体取决于使用情况 发生 OutOfMemoryError java lang OutOfMemoryError Failed to allocate a 604 by
  • 在 Android 上滑动即可切换标签,例如 YouTube/Google Music 应用

    在最新版本的应用程序中 谷歌实现了一种非常酷的方式 可以在选项卡之间滑动而不是单击选项卡标题 我想知道是否有人对如何做到这一点有更具体的想法 以下是一些想法 欢迎批评 我最初的想法是这不是一个标准TabActivity举办儿童活动 事实上
  • 使用 ftrace 和 kprobes 捕获用户空间程序集(通过使用虚拟地址转换)?

    对于这篇较长的帖子表示歉意 我无法以较短的方式表述它 另外 也许这更适合 Unix Linux Stack Exchange 但我会首先在这里尝试 因为有一个ftrace tag 无论如何 我想观察用户程序的机器指令在完整的上下文中执行fu
  • 方法“[]”在 null 上调用。接收者:空

    为了隔离问题 我创建了一个新代码 一个新程序和一台新机器 相同的结果 它只是不想打印 quotes 之后且具有 anythingPrice 的任何值 我再次可以给您一个临时密钥 您可以完全运行代码 在你身边 请告诉我 import dart
  • AS3 中 onReleaseOutside 最简单的实现?

    我是 ActionScript 2 的长期用户 现在开始使用 ActionScript 3 我缺少的一件事是复制 AS2 MovieClip onReleaseOutside 功能的简单方法 几乎总是有必要实现这个事件 否则你会得到一些有趣
  • Http 请求仅在发布 Android APK 时失败

    我正在努力让我的应用程序在 Android APK 版本上运行 唯一失败的情况是生成和签名 apk 所有的http请求都不起作用 服务器在SSL下运行 我已经尝试过的所有场景 ionic serve gt 工作正常 ionic cordov
  • Gstreamer - Android 上的硬件加速视频解码

    我在 Android 手机上通过 RTP UDP 接收视频 但我发现 CPU 使用率非常高 几乎 100 的一个核心都用于解码视频 在高端设备上 视频播放几乎流畅 但在中低端设备上 我几乎每秒无法获得 1 帧 这是一个 H 264 视频流
  • WebApi 中的 Windows 任务计划程序或 TaskService 函数

    我想在 ASP NET Web API 中创建一些函数 这些函数应该每天在特定时间执行并执行特定任务 例如更新状态 记录 生成电子邮件 短信 我应该在代码中创建一个 TaskService using System using Micros
  • 为什么我的 unique_ptr 认为有一个空函数指针删除器? [复制]

    这个问题在这里已经有答案了 我正在尝试使用 C 学习 SDL 我创建了一个window h标头和一个window cpp用于存储 Window 类的源文件 在window h它看起来像这样 Class Window public Windo