DriverKit提供了 IONewZero
和 IOSafeDeleteNULL
。这些不会调用任何构造函数或析构函数。
假设我想在ivars结构中加入一些类(class)。该类不需要从OSObject
或IOService
继承。我应该如何构造该对象?如果我将它作为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/