Marshal.FreeHGlobal(IntPtr) Yöntem
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Daha önce işlemin yönetilmeyen belleğinden ayrılan belleği boşaltıyor.
public:
static void FreeHGlobal(IntPtr hglobal);
[System.Security.SecurityCritical]
public static void FreeHGlobal (IntPtr hglobal);
public static void FreeHGlobal (IntPtr hglobal);
[<System.Security.SecurityCritical>]
static member FreeHGlobal : nativeint -> unit
static member FreeHGlobal : nativeint -> unit
Public Shared Sub FreeHGlobal (hglobal As IntPtr)
Parametreler
- hglobal
-
IntPtr
nativeint
özgün eşleşen çağrısı tarafından döndürülen tanıtıcı AllocHGlobal(IntPtr).
- Öznitelikler
Örnekler
Aşağıdaki örnekte FreeHGlobal yönteminin çağrılması gösterilmektedir. Bu kod örneği, Marshal sınıfı için sağlanan daha büyük bir örneğin parçasıdır.
// Demonstrate how to call GlobalAlloc and
// GlobalFree using the Marshal class.
IntPtr hglobal = Marshal::AllocHGlobal(100);
Marshal::FreeHGlobal(hglobal);
// Demonstrate how to call GlobalAlloc and
// GlobalFree using the Marshal class.
IntPtr hglobal = Marshal.AllocHGlobal(100);
Marshal.FreeHGlobal(hglobal);
' Demonstrate how to call GlobalAlloc and
' GlobalFree using the Marshal class.
Dim hglobal As IntPtr = Marshal.AllocHGlobal(100)
Marshal.FreeHGlobal(hglobal)
Aşağıdaki örnek, yönetilen String sınıfının içeriğini yönetilmeyen belleğe dönüştürmeyi ve bittiğinde yönetilmeyen belleği atmayı gösterir.
using namespace System;
using namespace System::Runtime::InteropServices;
#include <iostream> // for printf
int main()
{
// Create a managed string.
String^ managedString = "Hello unmanaged world (from the managed world).";
// Marshal the managed string to unmanaged memory.
char* stringPointer = (char*) Marshal::StringToHGlobalAnsi(managedString ).ToPointer();
printf("stringPointer = %s\n", stringPointer);
// Always free the unmanaged string.
Marshal::FreeHGlobal(IntPtr(stringPointer));
return 0;
}
using System;
using System.Runtime.InteropServices;
using System.Threading;
class MainFunction
{
static void Main()
{
Console.WriteLine("\nStringToGlobalAnsi\n");
// Create a managed string.
String managedString = "I am a managed String";
Console.WriteLine("1) managedString = " + managedString);
// Marshal the managed string to unmanaged memory.
IntPtr stringPointer = (IntPtr)Marshal.StringToHGlobalAnsi(managedString);
Console.WriteLine("2) stringPointer = {0}", stringPointer);
// Get the string back from unmanaged memory.
String RetrievedString = Marshal.PtrToStringAnsi(stringPointer);
Console.WriteLine("3) Retrieved from unmanaged memory = " + RetrievedString);
// Always free the unmanaged string.
Marshal.FreeHGlobal(stringPointer);
// IntPtr handle value is still the same:
Console.WriteLine("4) stringPointer = " + stringPointer);
// However, the data may be cleared after the memory is freed, depending on whether the memory allocated to stringPointer
// has been reclaimed or not. Uncommenting the following line (Thread.Sleep(1000)) increases the likelihood of the memory being reclaimed.
// Thread.Sleep(1000);
String RetrievedString2 = Marshal.PtrToStringAnsi(stringPointer);
Console.WriteLine("5) RetrievedString2 = " + RetrievedString2);
}
}
Açıklamalar
Önemli
Bu yerel bellek ayırıcısı, Yalnızca Windows platformundaki belirli Win32 API'leri tarafından çağrıldığında kullanılması gereken eski bir API'dir. .NET 6 veya üzerini hedeflerken yerel bellek ayırmak için tüm platformlardaki NativeMemory sınıfını kullanın. .NET 6 veya önceki sürümleri hedeflerken yerel bellek ayırmak için tüm platformlarda AllocCoTaskMem kullanın.
AllocHGlobal, ReAllocHGlobalveya eşdeğer yönetilmeyen API yöntemleri tarafından ayrılan genel yığından bellek boşaltmak için FreeHGlobal kullanabilirsiniz.
hglobal
parametresi IntPtr.Zero yöntemi hiçbir şey yapmaz.
FreeHGlobal, LocalFree işlevini Kernel32.DLL'den kullanıma sunar. Bu işlev tüm baytları boşaltarak hglobal
tarafından işaret edilen belleği artık kullanamazsınız.
FreeHGlobalek olarak, Marshal sınıfı iki bellek ayırma API'sini daha sağlar: DestroyStructure ve FreeCoTaskMem.