(Ayuda) Programa crashea al analizar una cadena (char *)

Iniciado por Seyro97, 26 Mayo 2015, 22:49 PM

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

Peregring-lk

#10
Cuando haces un `realloc`, si no hay espacio para añadir un elemento más en la localización actual, `realloc` te mueve el vector a una posición diferente, y dicha nueva dirección de memoria, se devuelve. Debes asignar dicho nuevo valor:

Código (cpp) [Seleccionar]

_value = (char*)realloc(_value, num_characters + 1);


Aunque si trabajas en C++, utiliza los `castings` correspondientes (ya que `realloc` devuelve un puntero de tipo `void*`):

Código (cpp) [Seleccionar]

_value = static_cast<char*>(realloc(_value, num_characters + 1));

x64core

#11
No olvidar validar el puntero devuelto por realloc, éste podria ser un valor nulo asi que  se sobreescribiria la variable con el puntero valido a la memoria dinamica como resultado dando una fuga de memoria. Además porqué no simplemente usar memcpy o strcpy para copiar las cadenas de entrada en lugar de usar un for y tener multiples variables. algunos compiladores puede que no optimizen esas partes.

Veo que estás implementado una especie de std::string, puede que estes interesado en hecharlo un vistazo a las librerias del compilador (VC++):
%ProgramFiles%\Microsoft Visual Studio <Version>\VC\crt\src

O unas más "claras" y simples:
http://www.keithschwarz.com/interesting/

->  code/string/String.cpp.html

-

Acerca del problema usando el compilador, no es especifico del compilador y más bien deberias de estar feliz que VC++ agrega comprobadores para detectar que se está escribiendo en memoria no reservada y corrompiendo memoria del heap.

Eternal Idol

#12
http://www.cplusplus.com/reference/cstdlib/realloc/

Return Value
A pointer to the reallocated memory block, which may be either the same as ptr or a new location. The type of this pointer is void*, which can be cast to the desired type of data pointer in order to be dereferenceable.

Si realloc no devuelve _value estas escribiendo en cualquier lado (memoria liberada).

PD. El que llame a toString tiene que liberar la memoria que este reserva.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

x64core

Cita de: Eternal Idol en 27 Mayo 2015, 03:33 AM
http://www.cplusplus.com/reference/cstdlib/realloc/

Si realloc no devuelve _value estas escribiendo en cualquier lado (memoria liberada).

Si realloc devuelve un nulo, el puntero a memoria es aún valido, la memoria no es liberada ;D

Eternal Idol

Cita de: x64Core en 27 Mayo 2015, 03:54 AM
Si realloc devuelve un nulo, el puntero a memoria es aún valido, la memoria no es liberada ;D

Si, por eso deberia asignar el valor devuelto en una tercera variable momentaneamente (aunque me imagino que esta fallando por el otro caso no contemplado).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón