Bagikan melalui


Marshal.FreeHGlobal(IntPtr) Metode

Definisi

Membebaskan memori yang sebelumnya dialokasikan dari memori proses yang tidak dikelola.

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

Handel yang dikembalikan oleh panggilan pencocokan asli ke AllocHGlobal(IntPtr).

Atribut

Contoh

Contoh berikut menunjukkan panggilan metode FreeHGlobal. Contoh kode ini adalah bagian dari contoh yang lebih besar yang disediakan untuk kelas 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)

Contoh berikut menunjukkan cara mengonversi konten kelas String terkelola ke memori yang tidak dikelola lalu membuang memori yang tidak dikelola setelah selesai.

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

Keterangan

Penting

Alokator memori asli ini adalah API warisan yang harus digunakan secara eksklusif ketika dipanggil oleh API Win32 tertentu pada platform Windows. Saat menargetkan .NET 6 atau yang lebih baru, gunakan kelas NativeMemory di semua platform untuk mengalokasikan memori asli. Saat menargetkan .NET 6 atau yang lebih lama, gunakan AllocCoTaskMem di semua platform untuk mengalokasikan memori asli.

Anda dapat menggunakan FreeHGlobal untuk membebaskan memori apa pun dari timbunan global yang dialokasikan oleh AllocHGlobal, ReAllocHGlobal, atau metode API yang tidak dikelola yang setara. Jika parameter hglobalIntPtr.Zero metode tidak melakukan apa pun.

mengekspos fungsi LocalFree dari Kernel32.DLL, yang membebaskan semua byte sehingga Anda tidak dapat lagi menggunakan memori yang ditunjukkan oleh .

Selain FreeHGlobal, kelas Marshal menyediakan dua metode API dealokasi memori lainnya: DestroyStructure dan FreeCoTaskMem.

Berlaku untuk

Lihat juga