Compartir a través de


Método Marshal.FreeHGlobal (IntPtr)

 

Publicado: octubre de 2016

Libera memoria previamente asignada de la memoria no administrada del proceso.

Espacio de nombres:   System.Runtime.InteropServices
Ensamblado:  mscorlib (en mscorlib.dll)

Sintaxis

[SecurityCriticalAttribute]
public static void FreeHGlobal(
    IntPtr hglobal
)
public:
[SecurityCriticalAttribute]
static void FreeHGlobal(
    IntPtr hglobal
)
[<SecurityCriticalAttribute>]
static member FreeHGlobal : 
        hglobal:nativeint -> unit
<SecurityCriticalAttribute>
Public Shared Sub FreeHGlobal (
    hglobal As IntPtr
)

Parámetros

Comentarios

Puede usar FreeHGlobal para liberar memoria del montón global asignada por AllocHGlobal, ReAllocHGlobal, o método de API no administrada de ningún comando equivalente. Si el hglobal parámetro es IntPtr.Zero el método no hace nada.

FreeHGlobal expone la LocalFree función de Kernel32.DLL, que libera todos los bytes, por lo que ya no se puede utilizar la memoria señalada por hglobal.

Además FreeHGlobal, la Marshal clase proporciona métodos de la API de dos otra desasignación de memoria: DestroyStructure y FreeCoTaskMem.

Win95Win98Win98SeWinMe

Passing an invalid handle value to M:System.Runtime.InteropServices.Marshal.FreeHGlobal(System.IntPtr) causes an T:System.ArgumentException.

Ejemplos

En el ejemplo siguiente se muestra la forma de llamar al método FreeHGlobal. Este ejemplo de código forma parte de un ejemplo mayor proporcionado para el Marshal clase.

// 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)
// Demonstrate how to call GlobalAlloc and 
// GlobalFree using the Marshal class.
IntPtr hglobal = Marshal::AllocHGlobal(100);
Marshal::FreeHGlobal(hglobal);

En el ejemplo siguiente se muestra cómo convertir el contenido de una clase administrada String clase memoria no administrada y, a continuación, desechar la memoria no administrada cuando haya terminado.

using System;
using System.Runtime.InteropServices;

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, it contains no data after being freed:
    String RetrievedString2 = Marshal.PtrToStringAnsi( stringPointer);
    Console.WriteLine("5) RetrievedString2 = " + RetrievedString2 );
    }
}
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;
}

Seguridad

SecurityCriticalAttribute

requires full trust for the immediate caller. This member cannot be used by partially trusted or transparent code.

Información de versión

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 1.1
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Windows Phone Silverlight
Disponible desde 8.0
Windows Phone
Disponible desde 8.1

Ver también

AllocHGlobal
ReAllocHGlobal
Clase Marshal
Espacio de nombres System.Runtime.InteropServices

Volver al principio