Sdílet prostřednictvím


Marshal.FreeHGlobal(IntPtr) Metoda

Definice

Uvolní paměť, která byla dříve přidělena 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 metoda. Tento příklad kódu je součástí většího příkladu poskytnutého pro třídu 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)

Následující příklad ukazuje, jak převést obsah spravované String třídy na nespravovanou paměť a potom 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

Důležitý

Tento nativní alokátor paměti je starší verze rozhraní API, které by se mělo používat výhradně při volání pro konkrétní rozhraní API Win32 na platformě Windows. Při cílení na .NET 6 nebo novější použijte třídu NativeMemory na všech platformách k přidělení nativní paměti. Při cílení na .NET 6 nebo starší použijte AllocCoTaskMem na všech platformách k přidělení nativní paměti.

Pomocí FreeHGlobal můžete uvolnit veškerou paměť z globální haldy přidělené AllocHGlobal, ReAllocHGlobalnebo jakékoli ekvivalentní nespravované metody rozhraní API. Pokud je parametr hglobalIntPtr.Zero metoda nic nedělá.

FreeHGlobal zpřístupňuje funkci LocalFree z Kernel32.DLL, která uvolní všechny bajty, takže už nebudete moct používat paměť, na kterou odkazuje hglobal.

Kromě FreeHGlobalposkytuje třída Marshal dvě další metody rozhraní API pro uvolnění paměti: DestroyStructure a FreeCoTaskMem.

Platí pro

Viz také