Bei der Verwendung von COM verlasse ich mich normalerweise auf ATL-Smartpointer wie ATL::CComPtr
und ATL::CComBSTR
für die Ressourcenverwaltung. Aber einige der Methoden, die ich anrufe, verwenden Ausgabeparameter, um Zeiger auf zugewiesenen Speicher zurückzugeben, den ich freigeben muss. Zum Beispiel:
Beachten Sie, dass GetDisplayName
weist Speicher für die Zeichenfolge zu und gibt über den Ausgabeparameter einen Zeiger auf die Zeichenfolge zurück. Es liegt in der Verantwortung des Aufrufers, diesen Speicher mit CoTaskMemFree
freizugeben.
Wenn DoSomething
eine Ausnahme auslöst, wird der obige Code undicht. Ich würde gerne eine Art Smart-Pointer für pszName
verwenden, um solche Lecks zu vermeiden, aber die API nimmt WCHAR**
, sodass ich nicht sehe, wie ich nur die Adresse eines dummen Zeigers übergeben kann. Da ich nicht die Zuteilung bin, kann ich RAII nicht verwenden.
Ich kann RRID verwenden, wenn ich einen Deleter wie folgt machen kann:
%Vor%Und weisen Sie dann den zurückgegebenen Zeiger sofort einem Standard-Smart-Zeiger wie folgt zu:
%Vor% Das funktioniert, aber es scheint fehleranfällig zu sein, eine zusätzliche Schutzvariable einzuführen. Bei diesem Ansatz wird pszName
beispielsweise auf den freigegebenen Speicher verweisen, sodass es leicht wäre, ihn versehentlich erneut zu verwenden.
Gibt es eine sauberere Möglichkeit, einen Smart-Pointer oder einen RAII-Wrapper für den vom COM-Server zugewiesenen Speicher zu verwenden, der vom Ausgabeparameter zurückgegeben wird? Fehle ich etwas, das ATL bietet?
ATL hat das schon aus der Box:
%Vor% CHeapPtr
kann abgeleitet werden, um andere Resource Releaser auf ähnliche Weise zu implementieren. CComHeapPtr
ist eine dokumentierte MSDN-Klasse .
Tags und Links c++ com smart-pointers atl