Могут ли `new` и` delete` использоваться в драйвере DriverKit? - PullRequest
1 голос
/ 16 июня 2020

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

Допустим, я хотел бы иметь какой-то класс в структуре ivars. Класс не должен наследовать от OSObject или IOService. Как мне построить этот объект? Если он у меня как член структуры ivars, конструктор моего класса не вызывается. Если я сохраню указатель на свой класс в структуре ivars, мне нужно выделить и вызвать конструктор класса. Могу ли я использовать для этого new / delete?

1 Ответ

1 голос
/ 17 июня 2020

Значение по умолчанию 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, и определенно должен использоваться для них, но не будет работать для других типов.

...