Compare Char* con String y operadores
Frecuentes
Visto 1,002 veces
0
Mi programa colapsa cuando lo ejecuto. Si comento fuera de linea if((str1->compare(*str2))==0 ){...}
funciona bien. No sé cómo comparar dos elementos de cadena * que creo y elimino después de comparar.
main.cpp: In function `int operator==(const Integer&, const Integer&)':
main.cpp:18: warning: taking address of temporary
main.cpp:19: warning: taking address of temporary
Entero.h
class Integer {
public:
Integer(int val, char *opis):m_val(val),m_opis(opis)
{
this->m_val = 0;
this->m_opis = strdup("0");
}
friend int operator==(const Integer&,const Integer&);
private:
int m_val;
char *m_opis;
}
main.cpp
int operator==(const Integer&a, const Integer&b){
string *str1 = &string ( a.m_opis );
string *str2 = &string ( b.m_opis );
if((str1->compare(*str2))==0 ){return 1 ;} //<- Here is my problem i think.
delete str1;
delete str2;
return 0;
}
}
//Objects and comparing
Integer o1(15,"lala");
Integer o2(150,"lala");
Integer o3;
cout<<o1==o2;
1 Respuestas
3
El problema es que str1
y str2
se encuentran las punteros colgantes, ya que los objetos temporales a los que apuntan ya no existen en el momento str1->compare()
se invoca: esto es lo que advierte el compilador.
No use objetos dinámicamente aquí, use objetos asignados a la pila:
string str1(a.m_opis);
string str2(b.m_opis);
Otros puntos
- prefiero usar
std::string
en lugar dechar*
(Integer.m_opis
). Relacionado ¿Qué es la regla de tres? m_opis
se establece dos veces en el constructor y todas las instancias deInteger
tendrá la misma cadena"0"
(lo mismo no significa el mismo búfer pero el mismo contenido). ídem param_val
.
contestado el 23 de mayo de 17 a las 11:05
Si uso objetos asignados a la pila, ¿puedo eliminarlos después de compararlos o permanecen en la memoria? - mateo
@mathewM, los objetos asignados a la pila se destruirán automáticamente cuando la función regrese. - hmjd
int operator==(const Integer&a, const Integer&b){ string str1(a.m_opis); string str2(b.m_opis); if((str1.compare(str2))==0 ){ return 1 ;} else return 0; }
Esto no funciona ahora. - mateo
@mathewM, debe publicar otra pregunta para esto, ya que no está relacionada con el bloqueo que fue el tema de esta pregunta. Hacer otra pregunta significará que más personas la verán y contribuirán a resolver el problema. - hmjd
Deberías escuchar a tu compilador y tal vez, ya sabes, no tomar la dirección de un temporal en las líneas 18 y 19.- Adam Rosenfield
¿Por qué toma las direcciones de los argumentos de cadena y luego intenta eliminarlos? No veo ninguna razón para usar punteros aquí. - Oliver Charlesworth
PONTE ATENTO CUANDO TU COMPILADOR TE DA ADVERTENCIAS!!!!!!! - Edward Strange