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

// 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 String kelas 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

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. hglobal Jika parameter adalah IntPtr.Zero metode tidak melakukan apa-apa.

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

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

Berlaku untuk

Lihat juga