Marshal.FreeHGlobal(IntPtr) Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Uvolní dříve přidělenou paměť z nespravované paměti procesu.
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)
Parametry
- hglobal
-
IntPtr
nativeint
Popisovač vrácený původním odpovídajícím voláním .AllocHGlobal(IntPtr)
- Atributy
Příklady
Následující příklad ukazuje volání FreeHGlobal metody . Tento příklad kódu je součástí většího příkladu Marshal pro třídu .
// 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)
Následující příklad ukazuje, jak převést obsah spravované String třídy na nespravovanou paměť a poté odstranit nespravovanou paměť po dokončení.
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);
}
}
Poznámky
Můžete použít FreeHGlobal k uvolnění jakékoli paměti z globální haldy přidělené pomocí AllocHGlobal, ReAllocHGlobalnebo jakékoli ekvivalentní nespravované metody rozhraní API.
hglobal
Pokud je IntPtr.Zero parametrem , metoda neprovede nic.
FreeHGlobal zpřístupňuje funkci LocalFree z Kernel32.DLL, která uvolní všechny bajty, takže paměť, na hglobal
kterou odkazuje , již nelze použít.
Kromě FreeHGlobalMarshal třídy poskytuje třída dvě další metody rozhraní API pro zrušení přidělení paměti: DestroyStructure a FreeCoTaskMem.