Могут ли `new` и` delete` использоваться в драйвере DriverKit?
DriverKit предоставляет IONewZero
а также IOSafeDeleteNULL
. Они не вызывают никаких конструкторов или деструкторов.
Допустим, я хотел бы иметь какой-то класс в структуре ivars. Класс не должен наследовать отOSObject
ни IOService
. Как мне построить этот объект? Если я буду участникомivars
struct конструктор моего класса не вызывается. Если я сохраню указатель на свой класс в структуре ivars, мне нужно выделить и вызвать конструктор класса. Могу ли я использоватьnew
/ delete
для этого?
1 ответ
По умолчанию operator new
действительно реализован в среде выполнения DriverKit. Я успешно использовал его для выделения и инициализации моего…_IVars
сами объекты. (тип PIMPL, который автоматически объявляется вперед заголовком, сгенерированнымiig
для любых классов, определенных в .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
-производные типы и обязательно должны использоваться для них, но не будут работать для других типов.