c++ - 可以在DriverKit驱动程序中使用 `new`和 `delete`吗?

标签 c++ macos-catalina driverkit macos-system-extension

DriverKit提供了 IONewZero IOSafeDeleteNULL 。这些不会调用任何构造函数或析构函数。

假设我想在ivars结构中加入一些类(class)。该类不需要从OSObjectIOService继承。我应该如何构造该对象?如果我将它作为ivars结构的成员,则不会调用我的类的构造函数。如果我在ivars结构中保留指向类的指针,则需要分配并调用该类的构造函数。我可以为此使用new / delete吗?

最佳答案

实际上,默认operator new是在DriverKit运行时中实现的。我已经成功地使用它来分配和初始化自己的…_IVars对象。 (对于iig文件中定义的任何类,由.iig生成的 header 会自动向前声明的PIMPL类型)

所以,我实际上是在MyDriver::init()中这样做的:

    this->ivars = new MyDriver_IVars();

然后在MyDriver::free()中:
    if (this->ivars != nullptr)
    {
        // … some extra cleanup …

        delete this->ivars;
        this->ivars = nullptr;
    }

在我看来,这是由于iig系统强加给我们的约束而可以实现的最简洁的方法。

我强烈怀疑operator new的实现与常规macOS用户空间中的后端相同,尽管到目前为止我还没有遇到任何问题,但实际上我还没有去检查。显然,相应的delete也可以工作。
OSTypeAlloc适用于OSObject派生的类型,绝对应该用于这些类型,但不适用于其他类型。

关于c++ - 可以在DriverKit驱动程序中使用 `new`和 `delete`吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62408857/

相关文章:

c++ - CString 赋值错误

C++11内存模型: why can't compiler move statements across load() operations during optimization?

C++使用promise,future从线程返回多个值?

mysql - MAMP Pro 和 MySQL 出现 fatal error : Please read "Security" section of the manual to find out how to run mysqld as root

python - 安装了 python 3 和 pip 3 但 pip -V 显示 19.2.3

c++ - 为什么 SFINAE 不选择 const-reference-taking 重载?

Swift:如何将 "acceptsFirstMouse"应用于使用 SwiftUI 构建的应用程序?

macos - DriverKit 中可以将哪些选项传递给 IOService::Terminate

macos - 我应该使用 IOKit 或 DriverKIt(或 HIDDriverKit)为 macOS 中的 USB 或蓝牙多点触控设备编写驱动程序吗?