Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Arabirimlere yönelik işaretçilerin ömrü her zaman her COM arabiriminde AddRef ve Release yöntemleriyle yönetilir. Daha fazla bilgi için bkz. Başvuru Sayılarını Yönetme kuralları.
Diğer tüm parametreler için, belleği yönetmek için belirli kurallara uymak önemlidir. Aşağıdaki kurallar, değere göre geçirilmeyen dönüş değeri de dahil olmak üzere arabirim yöntemlerinin tüm parametreleri için geçerlidir:
- In-parameters ayrılmalıdır ve çağıran tarafından serbest.
- Out-parameters adlı parametre tarafından ayrılmalıdır; bunlar, standart COM görev bellek ayırıcısı kullanılarak çağıran tarafından serbesttir. Daha fazla bilgi için bkz. OLE Bellek Ayırıcısı .
- In/out parametreleri başlangıçta çağıran tarafından ayrılır ve gerekirse çağrılan tarafından serbest bırakılır ve yeniden ayrılır. Out parametreleri için doğru olduğu gibi, çağıran son döndürülen değeri boşaltmaktan sorumludur. Standart COM bellek ayırıcısı kullanılmalıdır.
Bir kod parçasının belleği ayırdığı ve farklı bir kod parçasının serbest kaldığı ikinci iki durumda, COM ayırıcısını kullanarak iki kod parçasının aynı ayırma yöntemlerini kullanmasını sağlar.
Özel dikkat gerektiren bir diğer alan da hata koşullarında out ve in-out parametrelerinin işlenmesidir. bir işlev hata kodu döndürürse, çağıranın genellikle giden veya giden parametreleri temizlemenin bir yolu yoktur. Bu, aşağıdaki ek kurallara yol açar:
- Bir hata koşulu söz konusu olduğunda, parametreler her zaman güvenilir bir şekilde çağıranın herhangi bir eylemi olmadan temizlenecek bir değere ayarlanmalıdır.
- Tüm out işaretçisi parametreleri açıkça NULLolarak ayarlanmalıdır. Bunlar genellikle işaretçiden işaretçiye parametresinde geçirilir, ancak çağıranın ayırıp kod doldurduğu bir yapının üyeleri olarak da geçirilebilir. Bunun (kısmen) işlev girdisinde null olarak ayarlanmasını sağlamanın en kolay yoludur. Bu kural, daha güçlü uygulama birlikte çalışabilirliğini yükselttiği için önemlidir.
- Hata koşulları altında, tüm giden parametreler çağrılan kod tarafından yalnız bırakılmalı (bu nedenle çağıran tarafından başlatıldıkları değerde kalmalıdır) veya out parametresi hata dönüş durumunda olduğu gibi açıkça ayarlanmalıdır.
COM uygulamaları için bu bellek yönetimi kurallarının yalnızca genel arabirimler ve API'ler arasında geçerli olduğunu unutmayın; bu mekanizmalar kullanılarak bir COM uygulamasına tamamen dahili bellek ayırma yapılması gerekmez.
Warning
.NET/yönetilen kod birlikte çalışmasında yaygın tuzak: .NET COM arabirimlerini kullanırken (C# veya VB.NET), Çalışma Zamanı Çağrılabilen Sarmalayıcı (RCW) çoğu bellek yönetimini otomatik olarak işler. Ancak, -allocated dizesini (bir outLPWSTR) döndüren COM stili bir CoTaskMemAllocişlevi çağırırsanız, bunu ile Marshal.FreeCoTaskMem serbest bırakmanız gerekir; çöp toplayıcı COM görev belleğini serbest bırakmaz:
// C# example — COM function returns a CoTaskMemAlloc'd string
[DllImport("shell32.dll", CharSet = CharSet.Unicode)]
static extern int SHGetKnownFolderPath(
ref Guid rfid, uint dwFlags, IntPtr hToken, out IntPtr ppszPath);
// Caller must free the returned string
IntPtr pathPtr = IntPtr.Zero;
try
{
Guid folderId = new("374DE290-123F-4565-9164-39C4925E467B"); // Downloads
int hr = SHGetKnownFolderPath(ref folderId, 0, IntPtr.Zero, out pathPtr);
Marshal.ThrowExceptionForHR(hr);
string path = Marshal.PtrToStringUni(pathPtr)!;
}
finally
{
if (pathPtr != IntPtr.Zero)
Marshal.FreeCoTaskMem(pathPtr); // Required — prevents memory leak
}
Başparmak kuralı: Yerel bir COM işlevi, çağıranın ile CoTaskMemFreebir out parametresini boşaltması gerektiğini belgelerse, yönetilen eşdeğeri olur Marshal.FreeCoTaskMem. Bunlar farklı ayırıcılar olduğundan, COM görev belleği için hiçbir zaman kullanmayın Marshal.FreeHGlobal .
COM, istemciler ve sunucular arasında iletişim kurmak için uzaktan yordam çağrılarını (RPC) dahili olarak kullanır. RPC sunucu saptamalarında belleği yönetme hakkında daha fazla bilgi için sunucu saplama bellek yönetimi konusuna bakın.
İlgili konular
- Bellek Ayırma Yönetme