DriverKit提供IONewZero和IOSafeDeleteNULL。它们不调用任何构造函数或析构函数。
假设我希望在ivars结构中有一些类。该类不需要从OSObject继承,也不需要从IOService继承。我应该如何构造这个对象?如果我将它作为ivars结构中的成员,则不会调用我的类的构造函数。如果我在ivars结构中保存一个指向我的类的指针,我需要分配和调用这个类的构造函数。我可以使用new / delete来做这件事吗?
发布于 2020-06-17 16:33:20
默认operator new实际上是在DriverKit运行时中实现的。我已经成功地使用它来分配和初始化我的…_IVars对象本身。(对于.iig文件中定义的任何类,由iig生成的标头自动转发声明的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-derived类型,绝对应该用于这些类型,但不适用于其他类型。
https://stackoverflow.com/questions/62408857
复制相似问题