Хакер писал(а):Вообще, меня сильно беспокоит, почему когда я делал этот пример, я ввёлся в заблуждение.
Ты имеешь в виду этот код?
- Код: Выделить всё
void __declspec(naked) MakeSecondPass(PTOKENRECORD pTkSq, LPVOID pNodeConstructor, IUnknown *pRoot)
{ ... }
extern "C" int __declspec(dllexport) DoIt(LPCSTR pInputString, LPVOID pNodeConstructor, IUnknown* &pRoot)
{ ...
if(Balance != 0)
{
pRoot->Release();
pRoot = NULL;
goto exit;
}
pRoot->AddRef();
MakeSecondPass(TokenSequence, pNodeConstructor, pRoot);
Я не знаю.
1) [in,out] IUnknown* &pRoot по спецификации функции может ссылаться на NULL указатель, вследствие чего вызов Release() не пройдет. Это нужно учитывать.
2) Судя по описанию функции MakeSecondPass ничего серьезного с параметром pRoot быть не может, поскольку он является входным параметром [in]. Поэтому вызов pRoot->AddRef() является излишним, но поскольку это твои "потроха", которые могут иметь побочные эффекты, то имеешь право.
PS
Я не знаю, как бы я мог ответить не здесь, так что сорри за ОФФТОП.