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