Lo siento si es una pregunta obvia pero ni Google, ni una búsqueda aquí me condujo a una respuesta.

Hay una forma de eliminar una matriz totalmente?

Quiero que el opuesto de int[] array = new int[5]

  • Así im haciendo un curso de la universidad y el llenado de la (desafortunada) espacios en blanco de mi profesor nos deja con eso no es cubierto por la literatura con preguntas. Supongo que el arte de hacer preguntas es más importante para aprender las respuestas, de modo que la il seguir preguntando cuando no puedo encontrar una respuesta
  • posibles duplicados de ¿Cómo liberar memoria utilizada por una gran lista en C#?
  • Y cómo es exactamente la pregunta de 2009 con más upvotes y respuestas un duplicado de uno publicado este mes de julio?

10 Comentarios

  1. 40

    Dicen que llame a:

     void Foo(){
         int[] a = new int[5];
     }

    En C# no hay manera de anular la definición de la variable a. Eso significa que a será definido en Foo incluso si se establece a a null.
    Sin embargo, al final de Foo a se quedan fuera de alcance. Eso significa que ningún código puede hacer referencia a ella, y el recolector de basura se encargará de liberar la memoria para que la próxima vez que se ejecuta, que puede que no sea para mucho tiempo.

    • Me encanta que las respuestas definitivas 🙂 muchísimas Gracias por salvarme de googlear mucho más.
    • Sé que este es un hilo viejo, pero espero que alguien pueda ayudar. He observado la GC en el administrado ,Neto código no hace realmente un buen trabajo hasta que se cierra la aplicación. Cuando la asignación de memoria y la eliminación de las matrices o los objetos que se producen con mucha frecuencia y en varias ocasiones, no se libera la memoria, incluso cuando el uso de(){} los bloques están en su lugar. He observado que sigue sumando en el Administrador de Tareas mientras yo estoy sentado en el borde de mi silla, preguntándose cómo controlarlo antes de que se estrelle. Hay indocumentados secretos aquí?
    • Puranik, creo que tendrás mejor suerte pidiendo una nueva pregunta.
  2. 17

    Sólo tienes que dejarlo ir fuera de alcance, y espere a que el GC a encontrar; lo que podría no ser inmediato (de hecho, es casi seguro que no va a ser). Si usted tiene un campo de un objeto duradero (que va a permanecer en el ámbito de aplicación), entonces se puede establecer en null, lo que puede ayudar.

    Puede influir en la mesa a recoger pronto (no sólo los de su objeto: todo derecho), pero rara vez se debe si alguna vez hacer esto. Yo lo uso sólo en aparejos de prueba; pero:

    GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); //DON'T DO THIS!!!

    para obtener más información sobre GC.Collect:

  3. 5

    No hay necesidad de eliminar de la matriz, la GC que lidiar con él.

    (Muy) Resumen:

    Cuando se agota la memoria el recolector de basura arrancar, detener su código y recorrer todos los objetos vivos en la memoria.

    vivir significa alguna referencia sobre la pila, un registro, una referencia estática y algunas otras cosas que se conocen colectivamente como ‘GC Raíces». Como se atraviesa ellos se observa que están vivos.

    Si su matriz es no vivir no hay manera de que algo podría acceder a él (que es lo que determina liveness) por lo que la memoria que ocupaba estará disponible para su reutilización.

    No puede ser una razón para asignar la referencia a null si podría contener referencias vivas por más tiempo de lo que se desea o se mantiene una gran cantidad de memoria que necesita de inmediato, pero esto puede ser contraproducente y hacer que la matriz a vivir más tiempo. Instancia en lugar de la pila de variables son mejores candidatos para esta optimización si el que contiene instancia tendrá mucho más tiempo la vida de la matriz que contiene.

    Para ser claros, como un principiante, usted no debe considerar este tipo de cosas, vamos a la GC hacer su trabajo y sólo tratar de ayudar cuando usted:

    1. conocimiento de la necesidad de
    2. saber cómo
    3. saber cómo comprobar que lo hizo bien
  4. 5

    Usted debe leer Chris Brumme del artículo sobre el tema; los primeros párrafos se debe explicar la situación.

    Y nadie sugiriendo «asignar null a la variable» debería tomar nota, en particular, de la parte que dice:

    Incluso si se añade «aC = null;» después de su uso de la misma, el JIT es libre de considerar esta asignación de código muerto y eliminarlo.

  5. 3

    Solo para aclarar, en caso de que no entienden algunos de los términos expresados en las otras respuestas, GC significa que el recolector de basura. Lenguajes de programación como C#, que han administración automática de memoria le permiten centrarse en hacer lo que se debe hacer y no se preocupe de lo que estás creando y cuando lo elimine. La GC obras periódicamente ir a través de todos los objetos de crear y ver si tienen alguna referencia a ellos. Si no, esto significa que no hay manera de que usted puede hacer nada con ellos, por lo que bien podría ser eliminado, y que el sistema no sólo eso.

    Para obtener más detalles, consulte http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)

    • Exactamente. C# no es C++.
  6. 3

    array = null, pero creo que va a ser una buena idea si usted lee un poco sobre el .NETO de memoria modelo de gestión para entender completamente por qué.

    • ¿Realmente merecen un downvote para esto?
    • Podría decirse que se merecen un voto, porque está mal. Leer la parte acerca de la asignación de una referencia a null ser muertos código que el JIT es libre de eliminar aquí: blogs.msdn.com/cbrumme/archive/2003/04/19/51365.aspx
    • (Por CIERTO, no me di abajo-voto porque la sugerencia de leer más acerca de el .neto modelo de memoria es una buena)
    • Bueno, tienes razón, debería haber dejado claro que me refería más a la de «quiero opuesto de int matriz [] = new int[5]» declaración en lugar de la pregunta.
  7. 1

    El más cercano que consigue es simplemente esperar que quedar fuera del ámbito o ajuste a null.

    No quitar o eliminar la matriz de inmediato, pero después de quitar todas las referencias a la matriz, el recolector de basura (GC) se elimina en el tiempo…

  8. 0

    Puede declarar e inicializar la matriz en un if (true) {} instrucción, de la instrucción if (después de) la variable de matriz no es accesible, por lo que será borrado.

  9. 0

    En C++ se puede utilizar el eliminar palabra clave. Y fue originalmente mencionado en este comentario y en otros comentarios. La edición muestra la historia de este. Esta es una opción viable (aunque secundarios de respuesta) incluso si los demás no entienden por qué. Digo esto porque uno puede usar para encontrar su propia solución elegante, si ellos entienden más de un idioma.

    En .NET/MSIL, usted tiene la eliminación de palabra clave, pero se llama variablename.Dispose(). Estoy ofreciendo esto porque elimina todas las referencias a la variable, y la empuja hacia un estado de preparación para la recolección de basura. Otra opción es establecer la variable igual a null como que se mantenga la variable como un tipo de objeto, pero la liberación de lo que sostiene a la recolección de basura, por lo que puede ser reasignado más tarde.

    Original Comentario/Respuesta:

    La recolección de basura para C# es genial y todo, pero a veces usted realmente necesita para eliminar una variable de la memoria y hacer una nueva instancia de la misma, sin alguna otra parte de su programa que se mantiene viva. Uno tiene la capacidad potencialmente lugar de la existente fragmento de memoria que se celebró por la matriz en una GC estado, señalando la matriz en una nueva pieza de la memoria, tales como:

    aMyArray = new int[];

    El principal problema que veo con este camino, sin embargo, es que usted realmente no quiere perder un montón de memoria, y luego tener todo lo que viene a un alto como GC se inicia debido a que el sistema operativo se está volviendo loco. Yo tengo este pensamiento, teniendo en cuenta que C Sharp es ahora un general de idiomas y se utiliza en una gran cantidad de aplicaciones diferentes, incluyendo la redacción de los juegos… Que iba a ser realmente bueno si C Sharp no acto similar a ActionScript de FLASH/en este sentido.

  10. -4

    Esto puede haber sido resueltos, pero se puede tratar el arreglo como una pila. Bucle a través de él y pop de la parte superior de cada iteración.

    while(true)
    {
        if(array.Length==0)
        {
            break;
        }
        array.Pop();
    }

    de esta manera sólo puede llevar a más de los valores en la matriz sin tener que volver a crear instancias de ella

    • explicar la downvote? reinstantiating una matriz cada vez que desea restablecer los valores parece una pérdida de la memoria

Dejar respuesta

Please enter your comment!
Please enter your name here