Speicherverwaltung mit dem Interop-Marshaller
Der Interop-Marshaller versucht immer, von nicht verwaltetem Code reservierten Speicher zu belegen. Dieses Verhalten entspricht den Regeln der COM-Speicherverwaltung, weicht jedoch von den Regeln ab, die für systemeigenes C++ gelten.
Es kann zu Missverständnissen kommen, wenn Sie von systemeigenem C++-Verhalten (ohne Speicherfreigabe) ausgehen, wenn Sie einen Plattformaufruf verwenden, bei dem Speicher für Zeiger automatisch freigegeben wird. Beispielsweise wird beim Aufrufen der folgenden nicht verwalteten Methode aus einer C++-DLL kein Speicher automatisch freigegeben.
Nicht verwaltete Signatur
BSTR MethodOne (BSTR b) {
return b;
}
Wenn Sie allerdings die Methode als Prototyp eines Plattformaufrufs definieren, alle BSTR-Typen durch einen String-Typ ersetzen und MethodOne aufrufen, versucht die Common Language Runtime, b zweimal freizugeben. Sie können das Marshallingverhalten ändern, indem Sie anstelle von String-Typen IntPtr-Typen verwenden.
Die Laufzeit verwendet zum Freigeben von Speicher immer die CoTaskMemFree-Methode. Wenn der verwendete Speicher nicht mit der CoTaskMemAlloc-Methode belegt wurde, müssen Sie einen IntPtr verwenden und den Speicher manuell mit der entsprechenden Methode freigeben. Entsprechend können Sie die automatische Speicherfreigabe in Fällen verhindern, in denen der Speicher nie freigegeben werden soll, z. B. bei Verwendung der GetCommandLine-Funktion aus Kernel32.dll, die einen Zeiger auf Kernelspeicher zurückgibt. Ausführliche Informationen über die manuelle Freigabe von Speicher finden Sie im Beispiel für Puffer.
Siehe auch
Konzepte
Blitfähige und nicht blitfähige Typen