Все необработанные указатели должны обрабатываться с помощью Smartpointers в программе.
Но у меня проблемы с этим вызовом Xaudio2
HRESULT XAudio2Create(_Out_ IXAudio2 **ppXAudio2, _In_ UINT32 Flags,
_In_ XAUDIO2_PROCESSOR XAudio2Processor);
Мой вопрос: как вы используете умные указатели при передаче его в качестве указателя на указатель, и это вообще возможно? Если нет, то как мне поступить по-умному? Т.е. как передать умный указатель на параметр _Out_ IXAudio2 **ppXAudio2
Любая помощь будет высоко ценится.
Здесь есть две складки: во-первых, чтобы обработать тот факт, что функция ожидает необработанный указатель на (неконстантный!) Необработанный указатель, во-вторых, чтобы обойти тот факт, что все встроенные интеллектуальные указатели вызывают 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()
когда уместно. например АТЛ-х CComPtr
, Если у вас есть доступ к одному из них, вы можете использовать его вместо собственного.