1

DriverKit 提供IONewZeroIOSafeDeleteNULL. 那些不调用任何构造函数或析构函数。

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

4

1 回答 1

1

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

所以,我实际上是这样做的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派生类型,绝对应该用于这些类型,但不适用于其他类型。

于 2020-06-17T08:33:19.927 回答