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

Can `new` and `delete` be used in a DriverKit driver?

DriverKit 提供 IONewZero and IOSafeDeleteNULL。那些不调用任何构造函数或析构函数。

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

默认的operator new确实在DriverKit运行时实现了。我已经成功地使用它来分配和初始化我的 …_IVars objects 自己。 (由 iig.iig 文件中定义的任何 类 生成的 header 自动 forward-declared 的 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 用户 space 相同的 back-end 实现的,尽管我还没有真正去检查过,因为我没有遇到过到目前为止,它有任何问题。显然,相应的 delete 也有效。

OSTypeAlloc 适用于 OSObject 派生类型,绝对应该用于这些类型,但不适用于其他类型。