Freigeben über


Marshal.FreeHGlobal(IntPtr) Methode

Definition

Gibt Speicher frei, der zuvor aus dem nicht verwalteten Speicher des Prozesses zugewiesen wurde.

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

Das Handle, das vom ursprünglichen übereinstimmenden Aufruf an AllocHGlobal(IntPtr)zurückgegeben wird.

Attribute

Beispiele

Im folgenden Beispiel wird das Aufrufen der FreeHGlobal-Methode veranschaulicht. Dieses Codebeispiel ist Teil eines größeren Beispiels, das für die Marshal-Klasse bereitgestellt wird.

// 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)

Im folgenden Beispiel wird veranschaulicht, wie der Inhalt einer verwalteten String-Klasse in nicht verwalteten Speicher konvertiert und anschließend den nicht verwalteten Speicher verworfen wird.

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);
    }
}

Hinweise

Wichtig

Diese systemeigene Speicherverknürung ist eine Legacy-API, die ausschließlich verwendet werden sollte, wenn sie von bestimmten Win32-APIs auf der Windows-Plattform aufgerufen wird. Verwenden Sie bei der Zielbestimmung von .NET 6 oder höher die NativeMemory Klasse auf allen Plattformen, um nativen Speicher zuzuweisen. Verwenden Sie bei der Zielbestimmung von .NET 6 oder einer früheren Version AllocCoTaskMem auf allen Plattformen, um nativen Speicher zuzuweisen.

Sie können FreeHGlobal verwenden, um jeden Speicher aus dem globalen Heap freizugeben, der von AllocHGlobal, ReAllocHGlobaloder einer entsprechenden nicht verwalteten API-Methode zugewiesen wird. Wenn der hglobal-Parameter IntPtr.Zero ist, führt die Methode nichts aus.

FreeHGlobal macht die LocalFree-Funktion aus Kernel32.DLL verfügbar, wodurch alle Bytes freigegeben werden, sodass Sie den Speicher, auf den hglobalverweist, nicht mehr verwenden können.

Zusätzlich zu FreeHGlobalbietet die Marshal-Klasse zwei weitere Speicher-Deallocation-API-Methoden: DestroyStructure und FreeCoTaskMem.

Gilt für:

Weitere Informationen