Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Std::vector Y Punteros

Iniciado por DraKKaR, 09 de Enero de 2004, 11:38:43 AM

« anterior - próximo »

Kriller

 ethernet, sí he visto el ejemplo y por supuesto que petaría, por eso digo que hay que anderse con mucho ojo. Un caso real en el que me planteé usar contador de referencias: me planteaba para mi motor que diera la posibilidad al usuario de tener varios objetos CCamara y poder pasarle al motor una u otra en cada momento. Si el usuario se cepillaba el objeto CCamara que estuviera usando el motor y luego seguía usando el motor entonces explotaría; con un contador de referencias se evitaría ese problema. Pero al final decidí emplear otra filosofía  ;) .

Como dice seryu, las macros no muerden, aunque yo las utilizo en muy determinadas circunstancias. De hecho hay casos en los que no hay otra manera de hacer algo. Por ejemplo, para lo que yo digo: sobrecargando el delete no puedes poner a NULL el puntero que te han pasado, tendrías que hacerte una función tuya equivalente a la que le pasas un doble puntero.

A ver, no digo que no haya que usar contadores de referencias, sólo digo que la mayor parte del tiempo puedes vivir sin ello y que por eso no me gusta como filosofía permanente, sólo hay que emplearlas en casos concretos en los que realmente te reporten un beneficio.

ethernet

 Umh, siempre puedes usar una referencia a un puntero en vez de puntero a puntero
Y por lo general, macros sucks mucho

saludos

DraKKaR

 ¡Al fin! dios mio! he hallado el puto problema! que he encontrado de chiripa...

Resulta que tendo una DLL que contiene una clase. Entonces, si desde el módulo principal que carga la DLL intento crear una instancia a esa clase con:

MiClase *ale=new MiClase;

Pues resulta que al hacer el delete me daba el mensaje ese de assert que os comentaba al principio.
Después de micho carcomerme la cabeza.. me he dado cuenta que para crear una instancia de una clase que hay en una DLL (conclusiones propias...) debes hacerlo dentro de la propia DLL.
Ahora en la DLL hay una función
MiClase *CreaMiClase(void){ return new MiClase; }
que crea la instancia y me devuelve un puntero a ella.

Despues de hacer ese cambio.. todo perfecto y suave. Hay que ver, nunca habia leido nada sobre eso v.v.
Bueno, espero que mi experiencia os sirva como me ha servido a mí (pero sin tantos kebraderos de cabeza y intentos de suicidio).


Otra cosa, haciendo caso a ethernet estaba metiendo boost::shared_ptr<> en mi códig, y la verdad es que tiene muy buenas aplicaciones. Lo que no me gusta es que empastra mucho el código, pero eso debería ser lo de menos.
¿Alguno de vosotros la ha usado?¿Que opinión le merece al respecto?

Saludos.


BeRSeRKeR

 Si el problema era que creabas la instancia en la DLL y la eliminabas en la aplicación o viceversa, entonces, ZaelSiuS ya te lo indicó unos mensajes atrás:

Cita de: "ZaelSiuS"Pues mirando eso que has puesto, sólo se me ocurre que el new y el delete se hagan desde módulos diferentes, tal vez desde aplicación/dll  :huh:  y que teniendo zonas de memoria distintas sea esa la causa del error al hacer delete.

Ahora bien, si lo que estás diciendo es que no puedes crear una instancia de una clase implementada en una DLL fuera de ella, entonces suena bastante raro. :D

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

DraKKaR

 No, sí que puedo crear una instancia fuera de la DLL, lo que pasa es que cuando voy a hacer el delete el programa me petaba si el new no lo habia hecho desde la DLL. Pero el delete sí podia hacerlo desde el modulo principal.

Es decir, antes hacia el new y el delete en el mismo modulo (programa principal) y petaba. Cuando hice el new desde la DLL, ya se corrigió.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.