elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Ayuda] Error con delete[]... algo extraño...
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: [Ayuda] Error con delete[]... algo extraño...  (Leído 7,401 veces)
Khronos14


Desconectado Desconectado

Mensajes: 443


A lie is a lie


Ver Perfil WWW
Re: [Ayuda] Error con delete[]... algo extraño...
« Respuesta #10 en: 14 Julio 2011, 00:02 am »

¿Como ves mejor tu código?

Así:

Código
  1. void** RedimPreserve( void** __pp_vector , size_t _szt_now, size_t _szt_new )
  2. {
  3.    void            **__pp_back     = __pp_vector;
  4.    void            **__new_ptr     = NULL;
  5.  
  6.    if (_szt_now==_szt_new )
  7.        return __pp_vector;
  8.  
  9.    if ( _szt_new>0 ) {
  10.        __new_ptr       = new void*[_szt_new];
  11.        if ( _szt_now>0 && __new_ptr!=NULL && __pp_back!=NULL  )
  12.            if ( _szt_now>_szt_new )
  13.                memcpy          ( __new_ptr , __pp_back , _szt_new*sizeof(void*) );
  14.            else
  15.                memcpy          ( __new_ptr , __pp_back , _szt_now*sizeof(void*) );
  16.    } else
  17.        __new_ptr       = NULL;
  18.  
  19.    if ( __pp_back!=NULL )
  20.        delete[]        __pp_back;
  21.  
  22.    return __new_ptr;
  23. }
  24.  

O de esta manera:

Código
  1. void ** RedimPreserve(void ** buff, size_t currentSize, size_t newSize)
  2. {
  3.    void ** currentBuff = buff;
  4.    void ** temp = NULL;
  5.  
  6. if (currentSize == newSize)
  7. return buff;
  8.  
  9. if (newSize > 0)
  10. {
  11. temp = new void*[newSize];
  12. if (currentSize > 0 && temp != NULL && currentBuff != NULL)
  13. if (currentSize > newSize)
  14. memcpy(temp, currentBuff, newSize * sizeof(void*));
  15. else
  16. memcpy(temp, currentBuff, currentSize * sizeof(void*));
  17. }
  18. else
  19. temp = NULL;
  20.  
  21. if (buff != NULL)
  22. delete[] buff;
  23.  
  24. return temp;
  25. }
  26.  

Programar es un arte, y para un programador es un deber escribir buen código y que sea legible por otros.

Saludos.


« Última modificación: 14 Julio 2011, 00:05 am por Khronos14 » En línea

d(-_-)b


Desconectado Desconectado

Mensajes: 1.331



Ver Perfil WWW
Re: [Ayuda] Error con delete[]... algo extraño...
« Respuesta #11 en: 14 Julio 2011, 00:33 am »

Se nota la diferencia.  :P

saludos...


En línea

Max 400; caracteres restantes: 366
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [Ayuda] Error con delete[]... algo extraño...
« Respuesta #12 en: 14 Julio 2011, 00:47 am »

No me gusta declarar variables sin tener prefijos que NO me indiquen que tipo de variables son... es decir me guio en la nomeclatura hungara que de hecho estan hay por algo, es decir, mantenimiento de codigo a corto, media y largo plazo.

Digamoslo de esta manera:

Tienes 40 declaraciones de variables en un proceso X y varias lineas en tu proceso, si les pongo solo nombres sin que digan mucho ( tipo y/o clase ), y se lo doy a otro programador, este ultimo para que modificara solo 3 lineas, el pobre tendria que irse hasta donde estan declaradas las varibales para saber de que tipo son, y tambien para saber si se estan tratando variables tipo <Puntero>, <Puntero a Puntero> o en un caso mas raro saber si son <Punteros a Punteros a Puntero>, seria algo muy tedioso esto la vdd.

temp, Current, etc y si se desea hacer un cast entre tipos distintos, pues tendria el programador que estar transladandose a zonas que no tendria que transladarse a cada instante.

__pp_ <.. Puntero a puntero algunos solo hacen un    pNombreVariable...  yo le pongo los "_" solo para separar esta nomeclatura ( aun que estoy pensando solo realizar esto para los punteros de cualquier tipo... )

_tipo_nombre     otros ->  tipoNombre     ( Como dije estoy pensando en quitar los _ y dejarselo solo a los punteros... )

un ejemplo de lo que digo:

Código
  1.  
  2.    if (_szt_now==_szt_new )
  3.        return __pp_vector;
  4.  
  5.    if ( _szt_new>0 ) {
  6.        __new_ptr       = new void*[_szt_new];
  7.        if ( _szt_now>0 && __new_ptr!=NULL && __pp_back!=NULL  )
  8.            if ( _szt_now>_szt_new )
  9.                memcpy          ( __new_ptr , __pp_back , _szt_new*sizeof(void*) );
  10.            else
  11.                memcpy          ( __new_ptr , __pp_back , _szt_now*sizeof(void*) );
  12.    } else
  13.        __new_ptr       = NULL;
  14.  
  15.    if ( __pp_back!=NULL )
  16.        delete[]        __pp_back;
  17.  
  18.    return __new_ptr;
  19.  
  20.  

y tu codigo:

Código
  1.  
  2. if (currentSize == newSize)  
  3. return buff;
  4.  
  5. if (newSize > 0)
  6. {
  7. temp = new void*[newSize];
  8. if (currentSize > 0 && temp != NULL && currentBuff != NULL)
  9. if (currentSize > newSize)
  10. memcpy(temp, currentBuff, newSize * sizeof(void*));
  11. else
  12. memcpy(temp, currentBuff, currentSize * sizeof(void*));
  13. }
  14. else
  15. temp = NULL;
  16.  
  17. if (buff != NULL)
  18. delete[] buff;
  19.  
  20. return temp;
  21.  
  22.  

Ahora dime de que tipo son cada variable... solo lo sabrias si analizas el codigo pero eso conlleva tiempo... en mi caso si sabes que significan cada prefijo sabes que tipo son sin mayor problema.

otro ejemplo seria detectar errores entre comparaciones de Enteros con signo y enteros sin signo y asi detectar con tan solo ver las variables donde radica el error.

Ej:

Código
  1.  
  2. //Suponiendo que las variables estan perdidas en alguna parte del codigo... pero las variables tienen prefijos...
  3. dwVar  = -1;   // _dw_Var <--- yo lo haria asi pero creo que si quitare los "_"...
  4. //Tendriamos que verificar que dwvar no sea menor a 0 ya que udwvar no acepta numeros negativos... aun que tiene sus equivalencias.
  5. udwvar = dwvar;  //  Se tendria que hacer un casting...   ( -1 == -2147483648 )
  6.  
  7.  

si no tuviera prefijos...

Código
  1.  
  2. //Suponiendo que las variables estan perdidas en alguna parte del codigo... pero las variables tienen prefijos...
  3. // De que tipo es?... vamos a tener que buscar las desgraciadas variables... y esperemos que esten en donde se deberian declarar, si no tendremos que buscar en todo el codigo &#172;&#172;".
  4. Numero1  = -1;
  5. Numero2 = Numero1; //<--- Si aqui genera un error, y no sabemos porque, seguro haremos un casting... pero las variables pueden albergar la misma cantidad? es decir pesa lo mismo en memoria? o tenemos que cambiar el tipo de la variable para que soporte Numero2 a Numero1 y no se puedan bits/bytes(segun sea el caso)?.
  6.  
  7.  

Los codigo de los sitemas Operativos y/o programas variados tienen nomeclaturas similares y no manejan en muchos casos el tipo de declaraciones que aqui Todos han mencionado (Con excepciones claro). seguramente cada empresa de software maneja y/o define una nomeclatura "X" aun que otras pueden usar la nomeclatura recomendada y que mas se usa.

Como has dicho Programar es un arte y debe ser de facil interpretacion sea cual sea el caso...

Nota: A mi nomeclatura solo le he agregado "_" para separar nombre de tipos, y no morir en el intento, aun que no es la misma nomeclatura que se usa en las estructuras y demas debido a los "_" se comprende.

Dulces Lunas!¡.
« Última modificación: 14 Julio 2011, 01:01 am por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
Khronos14


Desconectado Desconectado

Mensajes: 443


A lie is a lie


Ver Perfil WWW
Re: [Ayuda] Error con delete[]... algo extraño...
« Respuesta #13 en: 14 Julio 2011, 00:58 am »

Vale, en lo de los tipos de datos tienes razón. De hecho para proyectos grandes, yo también lo hago. En el código que puse tienes 5 variables: newSize, currentSize, buff, currentBuff y temp. Creo que leyendo las variables sabes de que tipo son, excepto temp, el resto no tienen problemas.

A lo que nos referimos con tu código es al uso de __ para nombrar una variable, el uso de tabulaciones para pasar los parámetros a una función, a juntar los operadores con las variables (no lo soporto xD), etc..

Saludos.
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [Ayuda] Error con delete[]... algo extraño...
« Respuesta #14 en: 14 Julio 2011, 01:10 am »


A lo que nos referimos con tu código es al uso de __ para nombrar una variable, el uso de tabulaciones para pasar los parámetros a una función, a juntar los operadores con las variables (no lo soporto xD), etc..


Si bueno los _ como ya dije los usare para punteros de esa manera no los mesclare con el prefijo que designa al tipo, esto si no lo cmabiare, lo de las tabulaciones loq ue yaho yo es tener una linea imaginaria que me permita ordenar las asignaciones y no me genere personalmente peresa visual.

Código
  1.  
  2. asdasd = asd;
  3. asds=asd;
  4. asdsadasdsad=sd
  5. asdsd=sad;
  6. asds=a;
  7. d=s;
  8.  
  9.  

lo que hago es ordenarlo de esta manera

Código
  1.  
  2. asdasd          = asd;
  3. asds            = asd;
  4. asdsadasdsad    = sd
  5. asdsd           = sad;
  6. asds            = a;
  7. d               = s;
  8.  
  9.  

lo hago solo por la peresa viisual que me genera al ver tanto codigo juntado, lo del memcpy fue un error... ya que lo en C lo hago de esta manera.

Código
  1.  
  2. memcpy(
  3.       __new_ptr ,
  4.       __pp_back ,
  5.       _szt_now*sizeof(void*)
  6.       );
  7.  
  8.  

Pero como estoy haciendo pruebas y aun no comento nada lo dejo lineal para saber donde le faltan comentarios ( Muy breves pero explicitos ).

P.D.: Al final deje esta funcion de largo y use realloc() y malloc() para esto, dejando a new y delete para las clases.

Dulces Lunas!¡.
« Última modificación: 14 Julio 2011, 01:14 am por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [Ayuda] Error con delete[]... algo extraño...
« Respuesta #15 en: 14 Julio 2011, 02:51 am »

Comentarios subjetivos sobre la notación húngara se pueden encontrar muchos, por ejemplo en la pagina de Charles Petzold. No solo eso, en libros considerados "argumentos de autoridad" hay lineamientos que abren la puerta a todo tipo de discusiones.

Por ejemplo en la biblia de C++ (el libro "The C++ Programing Language") BS recomienda, entre otras cosas, el uso de fuentes proporcionales (y para alinear el texto eso implica el uso de tabuladores en lugar de espacios).

Sin tratar de echarle mas leña al fuego a la discusión en el sentido de "¿cual es mejor?" un documento interesante es:

Making Wrong Code Look Wrong by Joel Spolsky.

Hay que tomarlo de forma objetiva, mente abierta y cada quien sacara sus propias conclusiones.


----


Un cuestionamiento objetivo en contra del uso de nombres como "__pp_back" es el siguiente.

1) Al utilizar nombres de encabezados terminados con ".h" como "<stdio.h>" el nombre de espacios utilizado es el global.

2) En C (y eso incluye las facilidades de su biblioteca estándar) los nombres con un guion bajo inicial están reservados.

Si bien el riesgo de un conflicto de nombres es bajo seria mejor evitarlo ya sea utilizando los nombres "políticamente correctos" como "<cstdio>" o bien evitando los nombres en la forma ya mencionada.


----


En cuanto al programa de BlackZeroX este se puede mejorar, esto por varias razones. La primera es que la variable "__pp_back" solo se utiliza para almacenar el valor de "__pp_vector" sin que ninguna de ellas sea modificada, por ello esa variable se puede eliminar.

De forma similar a free se puede utilizar delete, no es necesario verificar si se pasa un puntero nulo ya que el comportamiento esta garantizado (no pasa nada). Eso nos lleva a eliminar la ultima sentencia condicional.

A la variable "__new_ptr" se le da un valor inicial de NULL, eso nos lleva a eliminar (por superflua) la rama (y asignación) en:
Código
  1. }else
  2.   __new_ptr = NULL;

Por ultimo un detalle que debo admitir si es subjetivo: al utilizar 0 en lugar de NULL evitamos incluir <cstdio>.

Con esos cambios (mas la nomenclatura al gusto) quedaría así:
Código
  1. #include <cstring>
  2. using std::memcpy;
  3.  
  4. #include <algorithm>
  5. using std::min;
  6.  
  7. void **RedimPreserve(void **buffer, size_t size, size_t new_size)
  8. {
  9.   if (size == new_size)
  10.      return buffer;
  11.  
  12.   void **new_buffer = 0;
  13.   if (new_size > 0) {
  14.      new_buffer = new void *[new_size];
  15.  
  16.      if (size > 0 && buffer != 0)
  17.         memcpy(new_buffer, buffer, min(size, new_size) * sizeof (void*));
  18.   }
  19.  
  20.   delete[] buffer;
  21.  
  22.   return new_buffer;
  23. }
  24.  
  25. int main()
  26. {
  27.   char **msg = NULL;
  28.  
  29.   msg = (char**) RedimPreserve((void**) msg , 00 , 10);
  30.   msg = (char**) RedimPreserve((void**) msg , 10 , 11);
  31.   msg = (char**) RedimPreserve((void**) msg , 11 , 10);
  32.   msg = (char**) RedimPreserve((void**) msg , 10 , 00);
  33.   msg = (char**) RedimPreserve((void**) msg , 00 , 13);
  34.   msg = (char**) RedimPreserve((void**) msg , 13 , 20);
  35.   delete[] msg;
  36.  
  37.   return 0;
  38. }

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Karman


Desconectado Desconectado

Mensajes: 673



Ver Perfil WWW
Re: [Ayuda] Error con delete[]... algo extraño...
« Respuesta #16 en: 14 Julio 2011, 04:04 am »

pero siguiendo tu lógica de programación el siguiente código:

Código
  1. void** RedimPreserve( void** __pp_vector , size_t _szt_now, size_t _szt_new )
  2. {
  3.    void            **__pp_back     = __pp_vector;
  4.    void            **__new_ptr     = NULL;
  5.  
  6.    if (_szt_now==_szt_new )
  7.        return __pp_vector;
  8.  
  9.    if ( _szt_new>0 ) {
  10.        __new_ptr       = new void*[_szt_new];
  11.        if ( _szt_now>0 && __new_ptr!=NULL && __pp_back!=NULL  )
  12.            memcpy          ( __new_ptr , __pp_back , _szt_now*sizeof(void*) );
  13.    } else
  14.        __new_ptr       = NULL;
  15.  
  16.    if ( __pp_back!=NULL )
  17.        delete[]        __pp_back;
  18.  
  19.    return __new_ptr;
  20. }

es más entendible de la forma: (size_t == unsigned integer)

Código
  1. void** RedimPreserve( void** __vVector , size_t uNow, size_t uNew ){
  2.    void            **__vBack     = __vVector;
  3.    void            **__vNewPtr     = NULL;
  4.  
  5.    if (uNow==uNew )
  6.        return __vVector;
  7.  
  8.    if ( uNew>0 ) {
  9.        __vNewPtr       = new void*[uNew];
  10.        if ( uNow>0 && __vNewPtr!=NULL && __vBack!=NULL  )
  11.            memcpy          ( __vNewPtr , __vBack , uNow*sizeof(void*) );
  12.    } else
  13.        __vNewPtr       = NULL;
  14.  
  15.    if ( __vBack!=NULL )
  16.        delete[]        __vBack;
  17.  
  18.    return __vNewPtr;
  19. }

aunque preferiría el modo:

Código
  1. void** RedimPreserve( void** ppvVector , size_t uNow, size_t uNew ){
  2.    void            **ppvBack     =ppvVector;
  3.    void            **ppvNewPtr     = NULL;
  4.  
  5.    if (uNow==uNew )
  6.        return ppvVector;
  7.  
  8.    if ( uNew>0 ) {
  9.        ppvNewPtr       = new void*[uNew];
  10.        if ( uNow>0 && ppvNewPtr!=NULL && ppvBack!=NULL  )
  11.            memcpy          ( ppvNewPtr , ppvBack , uNow*sizeof(void*) );
  12.    } else
  13.        ppvNewPtr       = NULL;
  14.  
  15.    if ( ppvBack!=NULL )
  16.        delete[]        ppvBack;
  17.  
  18.    return ppvNewPtr;
  19. }

S2

PD: Ni vi el código... solo la nomenclatura, de todas formas el código de rir3760 parece estar bien (y suele estarlo dado que le gustan este tipo de algoritmos :P)
« Última modificación: 14 Julio 2011, 04:13 am por Karman » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [Ayuda] Error con delete[]... algo extraño...
« Respuesta #17 en: 14 Julio 2011, 07:10 am »


Por ejemplo en la biblia de C++ (el libro "The C++ Programing Language") BS recomienda, entre otras cosas, el uso de fuentes proporcionales (y para alinear el texto eso implica el uso de tabuladores en lugar de espacios).
Un cuestionamiento objetivo en contra del uso de nombres como "__pp_back" es el siguiente.

1) Al utilizar nombres de encabezados terminados con ".h" como "<stdio.h>" el nombre de espacios utilizado es el global.

2) En C (y eso incluye las facilidades de su biblioteca estándar) los nombres con un guion bajo inicial están reservados.

Si bien el riesgo de un conflicto de nombres es bajo seria mejor evitarlo ya sea utilizando los nombres "políticamente correctos" como "<cstdio>" o bien evitando los nombres en la forma ya mencionada.


* Uso tabulador, no espacios...
* Ok no usare "_" para declarar variables al menos que lo requiera... ( mi idea no era "__Nombre" donde "__" indicara que son punteros mas bien "_pp_TipoNombre"...  _pp_szNombres ).
* Lo de la segunda variable y lo que presedia, ya me habia dado cuanta, pero solo me interesaba ese error, que ya esta solucionado aun asi te lo agradezco.
* Me quedo con la nomeclatura de 1 sola letra para indicar los prefijos de la variable( inclusive combinaciones como las que ha hecho Karman me gusto el prefijo "v" para tipos que puedan tomar distintos tipos de variable, inclusive me soluciono un ideal que tenia respecto a las combinaciones de los mismos ).
* NULL = (void*)0...
* Con estos dos ultimos Post muy completos me han quitado la sensacion de abrir un 2do Hilo de discucion.

P.D.: El tema ya se desvirtuo mucho, aun que ya aprendi una cosa mas!¡.

Dulces Lunas!¡.
« Última modificación: 14 Julio 2011, 07:19 am por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Delete ITEM
Programación Visual Basic
NetWar 5 2,490 Último mensaje 24 Marzo 2008, 12:17 pm
por jmordenata
SOLUCIONADO: Delete en mysql
Bases de Datos
mk_137 0 3,232 Último mensaje 28 Diciembre 2010, 13:24 pm
por mk_137
DELETE de resultado de un SELECT
Bases de Datos
XafiloX 4 7,615 Último mensaje 11 Febrero 2011, 18:21 pm
por XafiloX
para mi fue algo extraño en la recepción de un correo outlook 2010
Seguridad
Platanito Mx 8 3,946 Último mensaje 14 Julio 2016, 17:19 pm
por Platanito Mx
(ayuda) Operadores new y delete
Programación C/C++
TheZeck 3 1,879 Último mensaje 29 Julio 2016, 16:26 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines