Marshal.FreeHGlobal(IntPtr) Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Libera memoria allocata in precedenza dalla memoria non gestita del processo.
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)
Parametri
- hglobal
-
IntPtr
nativeint
Handle restituito dalla chiamata corrispondente originale a AllocHGlobal(IntPtr).
- Attributi
Esempio
Nell'esempio seguente viene illustrata la chiamata al metodo FreeHGlobal. Questo esempio di codice fa parte di un esempio più ampio fornito per la classe 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)
Nell'esempio seguente viene illustrato come convertire il contenuto di una classe gestita String in memoria non gestita e quindi eliminare la memoria non gestita al termine.
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);
}
}
Commenti
Importante
Questo allocatore di memoria nativa è un'API legacy che deve essere usata esclusivamente quando viene chiamato per da API Win32 specifiche nella piattaforma Windows. Quando la destinazione è .NET 6 o versione successiva, usare la classe NativeMemory in tutte le piattaforme per allocare memoria nativa. Quando la destinazione è .NET 6 o versioni precedenti, usare AllocCoTaskMem in tutte le piattaforme per allocare memoria nativa.
È possibile usare FreeHGlobal per liberare memoria dall'heap globale allocato da AllocHGlobal, ReAllocHGlobalo qualsiasi metodo API non gestito equivalente. Se il parametro hglobal
è IntPtr.Zero il metodo non esegue alcuna operazione.
FreeHGlobal espone la funzione LocalFree da Kernel32.DLL, che libera tutti i byte in modo che non sia più possibile usare la memoria a cui punta hglobal
.
Oltre a FreeHGlobal, la classe Marshal fornisce altri due metodi api di deallocazione della memoria: DestroyStructure e FreeCoTaskMem.