C# - Problemas con la memoria

Iniciado por anarquistadel89, 15 Octubre 2009, 04:26 AM

0 Miembros y 1 Visitante están viendo este tema.

anarquistadel89

Hola a todos, estoy empezando con el C# y me he puesto como objetivo desarrollar un blackjack, y me encuentro con que cada 3 o 4 partidas el juego se queda colgado...

He estado buscando y creo que el problema viene dado porque cuando hago:


Cartas carta1 = new Cartas();


Me reserva un nuevo espacio en la memoria, quando lo que quiero es que me la sobreescriba.
Para solucionarlo primero pense en detectar si el objeto ya estaba creado, y en ese caso modificarlo.


if(carta1 == null){
       carta1 = new Cartas();
}else{
       carta1.Carta();
}


El metodo Carta, realiza lo mismo que el constructor, pero asi edito el ya existente y me ahorro comer mas memoria.

No funciona  :¬¬

Sigo buscando, y saco la conclusion de que tengo dos opciones
- Evitar que reserve mas espacio en la memoria (hasta ahora fracaso u.u)
- Conseguir eliminar ese espacio que ocupa antes de ocupar uno nuevo.

Con lo segundo he intentado poner los objetos en null y utilitzar metodos para "llamar" al GC y no ha habido manera.

A ver si alguien puede darme algo de luz >_<

anarquistadel89@googlewave.com

sangano

Hola, estas seguro que se queda pegado por falta de memoria?, podrias poner el codigo del construtor para ver que es lo que hace.

Supestamente el metodo Cartas(), hace lo mismo que el constructor, donde guardas esa instancia, pon tambien el codigo del metodo, asi poder ayudarte mejor.

saludos.

Pablo Videla

No puedes llamar al metodo si no tienes el objeto creado... =S

anarquistadel89

#3

// Constructor
public Cartas(Random rnd) {
           this.palo = rnd.Next(1, 5);
           this.numero = rnd.Next(1, 14);
           // Construim ruta imatge a partir de les variables palo i numero
           this.imatge = ruta + this.palo + "_" + this.numero + ".JPG";
}
// Metodo
public void Carta(Random rnd) {
           this.palo = rnd.Next(1, 5);
           this.numero = rnd.Next(1, 14);
           this.imatge =ruta + this.palo + "_" + this.numero + ".JPG";
}




Estoy seguro de que no llamo al metodo sin haber creado el objeto. Ademas, el debuger me tiraria nullpointer.

La verdad es que si no es por memoria no se porque demonios se me puede quedar pegado.



Edit: Solucionado, no entiendo porque, pero al hacer esto ha dejado de quedarse pegado.

He pasado la creacion de el objeto de la clase Blackjack al metodo nuevoJuego. Antes lo ponia como un atributo.

anarquistadel89@googlewave.com

Pablo Videla

#4
Tienes razon lei mal el if  :xD
pero el rnd esta nulo ese parametro debes crear el objeto random xD

Código (csharp) [Seleccionar]

public void Carta(Random rnd) {
rnd= new Random();
            this.palo = rnd.Next(1, 5);
            this.numero = rnd.Next(1, 14);
            this.imatge =ruta + this.palo + "_" + this.numero + ".JPG";
}

anarquistadel89

El Random ese ya lo construyo en la clase BlackJack. Es decir
Código (csharp) [Seleccionar]

class Blackjack{

....

       Random rand = new Random((int)System.DateTime.Now.Ticks);
       if(carta1 == null){
            carta1 = new Cartas(rand);
       }else{
            carta1.Carta(rand);
       }

...
}

anarquistadel89@googlewave.com

MANULOMM

Bueno aunque ya se soluciono nunca esta demas que sepas que son:
Los Destructores.
Garbage Collector.
La interfaz IDiposable y su metodo Dipose.

Esto te ayuda a el eliminar memoria no deseada.
Algunos creen que el Garbage Collector lo hace todo instantaneamente y eso no siempre ocurre, por eso es aconsejable destruir los objetos si consumente mucha memoria o recursos externos a la aplicacion.

Atentamente,

Juan Manuel Lombana
Medellín - Colombia


pichucho87

Disculap donde puedo ver el codigo completo de este trabajo q esta interesante?