[Ayuda] Error con delete[]... algo extraño...

Iniciado por BlackZeroX, 7 Julio 2011, 23:33 PM

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

BlackZeroX

.
Intento Re-Crear el Redim Preserve de VB6 todo bien pero Cuando deseo volver a redimencionar Crashea alguien sabe por que?

Código (cpp) [Seleccionar]


#include <stdio.h>
#include <string.h>

void** RedimPreserve( void** __pp_vector , size_t _szt_now, size_t _szt_new )
{
    void            **__pp_back     = __pp_vector;
    void            **__new_ptr     = NULL;

    if (_szt_now==_szt_new )
        return __pp_vector;

    if ( _szt_new>0 ) {
        __new_ptr       = new void*[_szt_new];
        if ( _szt_now>0 && __new_ptr!=NULL && __pp_back!=NULL  )
            memcpy          ( __new_ptr , __pp_back , _szt_now*sizeof(void*) );
    } else
        __new_ptr       = NULL;

    if ( __pp_back!=NULL )
        delete[]        __pp_back;

    return __new_ptr;
}



int main () {
    char **_msg = NULL;

    _msg    = (char**)RedimPreserve( (void**)_msg , 00 , 10 );
    _msg    = (char**)RedimPreserve( (void**)_msg , 10 , 11 );
    _msg    = (char**)RedimPreserve( (void**)_msg , 11 , 10 );
    _msg    = (char**)RedimPreserve( (void**)_msg , 10 , 00 );
    _msg    = (char**)RedimPreserve( (void**)_msg , 00 , 13 );
    _msg    = (char**)RedimPreserve( (void**)_msg , 13 , 20 );
    delete[] _msg;
    return 0;
}



Dulces Lunas!¡
The Dark Shadow is my passion.

Ferno

Código (cpp) [Seleccionar]
if ( _szt_new>0 ) {
       __new_ptr       = new void*[_szt_new];
       memcpy          ( __new_ptr , __pp_back , _szt_now*sizeof(void*) );
   }


Será porque en el momento en que _szt_new sea menor a _szt_now (lo cual sucede en alguna instrucción del main), estarías pidiendo una memoria menor a la necesaria para realizar el memcpy?

EDIT: Ahora que veo decís que crashea en el delete[], no pensé en eso.

BlackZeroX

#2
.
Edito ya esta corregido:

Código (cpp) [Seleccionar]


#include <stdio.h>
#include <string.h>

void** RedimPreserve( void** __pp_vector , size_t _szt_now, size_t _szt_new )
{
    void            **__pp_back     = __pp_vector;
    void            **__new_ptr     = NULL;

    if (_szt_now==_szt_new )
        return __pp_vector;

    if ( _szt_new>0 ) {
        __new_ptr       = new void*[_szt_new];
        if ( _szt_now>0 && __new_ptr!=NULL && __pp_back!=NULL  )
            if ( _szt_now>_szt_new )
                memcpy          ( __new_ptr , __pp_back , _szt_new*sizeof(void*) );
            else
                memcpy          ( __new_ptr , __pp_back , _szt_now*sizeof(void*) );
    } else
        __new_ptr       = NULL;

    if ( __pp_back!=NULL )
        delete[]        __pp_back;

    return __new_ptr;
}



int main () {
    char **_msg = NULL;

    _msg    = (char**)RedimPreserve( (void**)_msg , 00 , 10 );
    _msg    = (char**)RedimPreserve( (void**)_msg , 10 , 11 );
    _msg    = (char**)RedimPreserve( (void**)_msg , 11 , 10 );
    _msg    = (char**)RedimPreserve( (void**)_msg , 10 , 00 );
    _msg    = (char**)RedimPreserve( (void**)_msg , 00 , 13 );
    _msg    = (char**)RedimPreserve( (void**)_msg , 13 , 20 );
    delete[] _msg;
    return 0;
}



Dulces Lunas!¡.
The Dark Shadow is my passion.

Ferno

#3
No, no me entendiste. Yo digo en el caso (es el tercer caso en tu main) en el que _szt_now (11) es mayor a _szt_new (10), por ende, en:
Código (cpp) [Seleccionar]
__new_ptr       = new void*[_szt_new];

estás pidiendo determinada cantidad de memoria.
Pero en:

Código (cpp) [Seleccionar]
memcpy          ( __new_ptr , __pp_back , _szt_now*sizeof(void*) );

estás copiando aún más memoria que la que pediste para __new_ptr.
Fijate que borrando el tercer caso, el programa funciona perfecto.

d(-_-)b

#4
Es la leche, ¿porque hay que escribir codigo tan feo?  :xD

Hablando en serio, es incomodo leer codigos asi ¬¬

saludos... :xD
Max 400; caracteres restantes: 366

BlackZeroX

#5
@Ferno.

Claro que te entend, de hecho por eso meti estos if

Muchas gracias.

Código (cpp) [Seleccionar]


        if ( _szt_now>0 && __new_ptr!=NULL && __pp_back!=NULL  )
            if ( _szt_now>_szt_new )
                memcpy          ( __new_ptr , __pp_back , _szt_new*sizeof(void*));
            else
                memcpy          ( __new_ptr , __pp_back , _szt_now*sizeof(void*))



por otro lado:

@Slow V.S.
para joderte la vida, para eso hay que escribirlo asi.

P.D.: Tengo mi propia nomeclatura para los prefijos que me hacen leer mis codigos facilmente.

Dulces Lunas!¡.
The Dark Shadow is my passion.

d(-_-)b

Citar@Slow V.S.
para joderte la vida, para eso hay que escribirlo asi.

Tu crees ?

Excelente

Max 400; caracteres restantes: 366

Karman


Valkyr

La verdad que es un poco tediosa la nomenclatura, pero bueno, cada cual que programe a su gusto, eso sí, no me gustaría tener que continuar un código que tu empezaste xD y lo digo sin mala intención y sin ánimo de burla.

Saludos.

BlackZeroX

En que sentido es tediosa? me gustaria saber.

Dulces Lunas!¡.
The Dark Shadow is my passion.