Могут ли `new` и` delete` использоваться в драйвере DriverKit?

DriverKit предоставляет IONewZero а также IOSafeDeleteNULL. Они не вызывают никаких конструкторов или деструкторов.

Допустим, я хотел бы иметь какой-то класс в структуре ivars. Класс не должен наследовать отOSObject ни IOService. Как мне построить этот объект? Если я буду участникомivarsstruct конструктор моего класса не вызывается. Если я сохраню указатель на свой класс в структуре 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-производные типы и обязательно должны использоваться для них, но не будут работать для других типов.

Другие вопросы по тегам