In unserem Code verwenden wir systematisch native COM-Unterstützung. Alles ist in Ordnung, außer dass es uns nicht gefällt, dass bei einem Fehler _com_raise_error() aufgerufen wird, der eine _com_error-Ausnahme auslöst. Da wir eine eigene Hierarchie von Ausnahmen haben, die diesen _com_error fangen, ist das unpraktisch - es ist nicht in unserer Hierarchie und erbt nicht von std :: exception.Wer übernimmt die IErrorInfo?
Also müssen wir die _com_raise_error() überschreiben. Es ist ganz einfach - definieren Sie es einfach in unserem Code, der Linker wird damit verlinkt.
Allerdings ist unklar, wer die IErrorInfo besitzt. Die Signatur ist
void __stdcall _com_raise_error(HRESULT hr, IErrorInfo* info);
Wer also die Funktion IErrorInfo :: Release für den Aufruf(), nachdem die Funktion zurückkehrt wäre verantwortlich nennt. Aber wie würde die Funktion überhaupt zurückkehren, wenn wir eine Ausnahme werfen und die Kontrolle woanders hin transferiert?
Ich überprüft - aufgerufen AddRef(), dann Release() sofort nach dem Eintritt in diese Funktion - der Referenzzähler ist 1. Später übergeben wir das Eigentum an das konstruierte Ausnahmeobjekt - es ruft AddRef() in seinem Konstruktor und Release () in Destruktor. Ich nehme an, das ist falsch, da AddRef() den Verweiszähler auf 2 erhöht, aber dann nur ein Release() aufgerufen wird (im Ausnahmedestruktor).
Sind ich richtig, dass die AddRef() im Konstruktor einen Speicherverlust verursacht oder gibt es einen internen Mechanismus, die IErrorInfo Objekte nicht erlaubt, überhaupt zu lecken?