Marshal.FreeHGlobal(IntPtr) Methode
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Hiermee wordt geheugen vrijgemaakt dat eerder is toegewezen aan het onbeheerde geheugen van het proces.
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)
Parameters
- hglobal
-
IntPtr
nativeint
De ingang die door de oorspronkelijke overeenkomende aanroep wordt AllocHGlobal(IntPtr)geretourneerd.
- Kenmerken
Voorbeelden
In het volgende voorbeeld ziet u hoe u de FreeHGlobal methode aanroept. Dit codevoorbeeld maakt deel uit van een groter voorbeeld voor de Marshal klasse.
// 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)
In het volgende voorbeeld ziet u hoe u de inhoud van een beheerde String klasse converteert naar onbeheerd geheugen en vervolgens het niet-beheerde geheugen kunt verwijderen wanneer u klaar bent.
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);
}
}
Opmerkingen
Important
Deze systeemeigen geheugentoewijzing is een verouderde API die uitsluitend moet worden gebruikt wanneer deze wordt aangeroepen door specifieke Win32-API's op het Windows-platform. Wanneer u zich richt op .NET 6 of hoger, gebruikt u de klasse NativeMemory op alle platforms om systeemeigen geheugen toe te wijzen. Wanneer u zich richt op .NET Framework, gebruikt u AllocCoTaskMem op alle platforms om systeemeigen geheugen toe te wijzen.
U kunt FreeHGlobal elk geheugen vrij maken van de globale heap die is toegewezen door AllocHGlobal, ReAllocHGlobalof een equivalente niet-beheerde API-methode. Als de parameter de hglobal methode is IntPtr.Zero , doet deze niets.
FreeHGlobal maakt de functie LocalFree beschikbaar vanuit Kernel32.DLL, waardoor alle bytes worden vrijgemaakt, zodat u het geheugen waarnaar wordt verwezen hglobalniet meer kunt gebruiken.
Bovendien FreeHGlobalbiedt de Marshal klasse twee andere methoden voor het toewijzen van geheugen-deallocatie: DestroyStructure en FreeCoTaskMem.