C ++ Как передать умный указатель в выходной параметр, который будет изменять указатель

0

Все необработанные указатели должны обрабатываться с помощью Smartpointers в программе.

Но у меня проблемы с этим вызовом Xaudio2

HRESULT XAudio2Create(_Out_  IXAudio2 **ppXAudio2, _In_   UINT32 Flags,
    _In_   XAUDIO2_PROCESSOR XAudio2Processor);

Мой вопрос: как вы используете интеллектуальные указатели при передаче его как указателя на указатель, и это даже возможно? Если нет, то как мне это сделать разумным образом? Т.е. как передать интеллектуальный указатель для параметра _Out_ IXAudio2 **ppXAudio2

Любая помощь будет высоко ценится.

  • 0
    Так как это выходной параметр, вы предположительно должны обернуть его в смарт - указатель после XAudio2Create возвращается. Вам понадобится пользовательское средство удаления, хотя, если есть другая функция, которую вы должны вызывать, чтобы освободить объекты, созданные таким образом.
Теги:
output
smart-pointers
parameters

1 ответ

1
Лучший ответ

Здесь есть две морщины - сначала нужно обработать тот факт, что функция ожидает необработанный указатель на (nonconst!) Необработанный указатель, во-вторых, чтобы обойти тот факт, что все встроенные интеллектуальные указатели вызывают delete на принадлежащем указателю когда вам нужно сделать это, вызовите его метод Release(). Ожидание создания интеллектуального указателя до тех пор, пока функция фабричной функции не вернется, решит проблему 1, и пользовательский удалённый может решить проблему 2. Точно, как вы хотите делать все зависит от вас, но что-то вроде этого должно работать:

IXAudio2* p = nullptr;
if(!SUCCEEDED(XAudio2Create(&p, GetFlags(), GetProcessor())))
    ; // fail
std::shared_ptr<IXAudio2> smart(p,
   [](IXAudio2* p) { p->Release(); }); // or unique_ptr with somewhat different syntax

Добавление: На протяжении многих лет было написано множество интеллектуальных указателей COM, которые в основном выполняются, а также, если это необходимо, также вызвать AddRef()/RemoveRef(). например, ATL CComPtr. Если у вас есть доступ к одному из них, вы можете использовать его вместо того, чтобы кататься самостоятельно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню