Ausnahmesichere Speicherbehandlung mit COM

8

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:

%Vor%

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?

    
Adrian McCarthy 14.03.2013, 20:36
quelle

1 Antwort

11

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 .

>     
Roman R. 14.03.2013, 21:01
quelle

Tags und Links