Minnesallokering i COM

Ibland allokerar en metod en minnesbuffert på heapen och returnerar buffertens adress till anroparen. COM definierar ett par funktioner för att allokera och frigöra minne på heapen.

Vi såg ett exempel på det här mönstret i dialogrutan Öppna:

PWSTR pszFilePath;
hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);
if (SUCCEEDED(hr))
{
    // ...
    CoTaskMemFree(pszFilePath);
}

Metoden GetDisplayName allokerar minne för en sträng. Internt anropar metoden CoTaskMemAlloc för att allokera strängen. När metoden returneras pekar pszFilePath på minnesplatsen för den nya bufferten. Anroparen ansvarar för att anropa CoTaskMemFree- för att frigöra minnet.

Varför definierar COM sina egna minnesallokeringsfunktioner? En anledning är att tillhandahålla ett abstraktionslager över heap-allokeraren. Annars kan vissa metoder anropa malloc medan andra anropar nya. Då skulle ditt program behöva anropa kostnadsfri i vissa fall och ta bort i andra, och att hålla reda på allt skulle snabbt bli omöjligt. COM-allokeringsfunktionerna skapar en enhetlig metod.

Ett annat övervägande är det faktum att COM är en binär standard, så det är inte kopplat till ett visst programmeringsspråk. Därför kan COM inte förlita sig på någon språkspecifik form av minnesallokering.

Nästa

COM-kodningsmetoder