可以在 DriverKit 驱动程序中使用 `new` 和 `delete` 吗?
Can `new` and `delete` be used in a DriverKit driver?
DriverKit 提供 IONewZero
and IOSafeDeleteNULL
。那些不调用任何构造函数或析构函数。
假设我想在 ivars 结构中有一些 class。 class 不需要继承自 OSObject
或 IOService
。我应该如何构造这个对象?如果我将它作为 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
派生类型,绝对应该用于这些类型,但不适用于其他类型。
DriverKit 提供 IONewZero
and IOSafeDeleteNULL
。那些不调用任何构造函数或析构函数。
假设我想在 ivars 结构中有一些 class。 class 不需要继承自 OSObject
或 IOService
。我应该如何构造这个对象?如果我将它作为 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
派生类型,绝对应该用于这些类型,但不适用于其他类型。