Speicherbelegung in COM
Manchmal ordnet eine Methode einen Speicherpuffer auf dem Heap zu und gibt die Adresse des Puffers an den Aufrufer zurück. COM definiert ein Paar von Funktionen zum Zuordnen und Freigeben von Arbeitsspeicher auf dem Heap.
- Die CoTaskMemAlloc-Funktion weist einen Speicherblock zu.
- Die CoTaskMemFree-Funktion gibt einen Speicherblock frei, der mit CoTaskMemAllocbelegt wurde.
Ein Beispiel für dieses Muster wurde im Beispiel für das Dialogfeld Öffnen angezeigt:
PWSTR pszFilePath;
hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);
if (SUCCEEDED(hr))
{
// ...
CoTaskMemFree(pszFilePath);
}
Die GetDisplayName-Methode belegt Arbeitsspeicher für eine Zeichenfolge. Intern ruft die Methode CoTaskMemAlloc auf, um die Zeichenfolge zuzuordnen. Wenn die Methode zurückgegeben wird, zeigt pszFilePath auf den Speicherort des neuen Puffers. Der Aufrufer ist für den Aufruf von CoTaskMemFree verantwortlich, um den Arbeitsspeicher freizugeben.
Warum definiert COM eigene Speicherbelegungsfunktionen? Ein Grund dafür ist die Bereitstellung einer Abstraktionsschicht über die Heapzuweisung. Andernfalls können einige Methoden malloc aufrufen, während andere neue aufgerufen haben. Dann müsste Ihr Programm in einigen Fällen "free" aufrufen und in anderen löschen, und es wäre schnell unmöglich, alles nachzuverfolgen. Die COM-Zuordnungsfunktionen erstellen einen einheitlichen Ansatz.
Ein weiterer Aspekt ist die Tatsache, dass COM ein binärer Standard ist und daher nicht an eine bestimmte Programmiersprache gebunden ist. Aus diesem Grund kann COM sich nicht auf eine sprachspezifische Form der Speicherbelegung verlassen.