Marshal.FreeHGlobal(IntPtr) Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Membebaskan memori yang sebelumnya dialokasikan dari memori proses yang tidak dikelola.
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)
Parameter
- hglobal
-
IntPtr
nativeint
Handel yang dikembalikan oleh panggilan pencocokan asli ke AllocHGlobal(IntPtr).
- Atribut
Contoh
Contoh berikut menunjukkan panggilan metode FreeHGlobal. Contoh kode ini adalah bagian dari contoh yang lebih besar yang disediakan untuk kelas Marshal.
// 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)
Contoh berikut menunjukkan cara mengonversi konten kelas String terkelola ke memori yang tidak dikelola lalu membuang memori yang tidak dikelola setelah selesai.
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);
}
}
Keterangan
Penting
Alokator memori asli ini adalah API warisan yang harus digunakan secara eksklusif ketika dipanggil oleh API Win32 tertentu pada platform Windows. Saat menargetkan .NET 6 atau yang lebih baru, gunakan kelas NativeMemory di semua platform untuk mengalokasikan memori asli. Saat menargetkan .NET 6 atau yang lebih lama, gunakan AllocCoTaskMem di semua platform untuk mengalokasikan memori asli.
Anda dapat menggunakan FreeHGlobal untuk membebaskan memori apa pun dari timbunan global yang dialokasikan oleh AllocHGlobal, ReAllocHGlobal, atau metode API yang tidak dikelola yang setara. Jika parameter hglobal
IntPtr.Zero metode tidak melakukan apa pun.
Selain FreeHGlobal, kelas Marshal menyediakan dua metode API dealokasi memori lainnya: DestroyStructure dan FreeCoTaskMem.