Aracılığıyla paylaş


Marshal.FreeHGlobal(IntPtr) Yöntem

Tanım

Daha önce işlemin yönetilmeyen belleğinden ayrılan belleği boşaltır.

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)

Parametreler

hglobal
IntPtr

nativeint

özgün eşleşen çağrısı AllocHGlobal(IntPtr)tarafından döndürülen tanıtıcı.

Öznitelikler

Örnekler

Aşağıdaki örnekte yönteminin çağrılması gösterilmektedir FreeHGlobal . Bu kod örneği, sınıfı için Marshal sağlanan daha büyük bir örneğin parçasıdır.

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

Aşağıdaki örnek, yönetilen String bir sınıfın içeriğini yönetilmeyen belleğe dönüştürmeyi ve bittiğinde yönetilmeyen belleği atmayı gösterir.

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

Açıklamalar

, veya eşdeğer yönetilmeyen API yöntemleri tarafından AllocHGlobalReAllocHGlobalayrılan genel yığından herhangi bir belleği boşaltmak için kullanabilirsinizFreeHGlobal. hglobal parametresi ise IntPtr.Zero yöntemi hiçbir şey yapmaz.

FreeHGlobalLocalFree işlevini Kernel32.DLL'den kullanıma sunar. Bu işlev tüm baytları boşaltır, böylece artık tarafından hglobalişaret edilen belleği kullanamazsınız.

sınıfına FreeHGlobalMarshal ek olarak iki bellek serbest bırakma API'si yöntemi daha sağlar: DestroyStructure ve FreeCoTaskMem.

Şunlara uygulanır

Ayrıca bkz.