Compare Char* con String y operadores

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;

preguntado el 22 de mayo de 12 a las 16:05

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.-

¿Por qué toma las direcciones de los argumentos de cadena y luego intenta eliminarlos? No veo ninguna razón para usar punteros aquí. -

PONTE ATENTO CUANDO TU COMPILADOR TE DA ADVERTENCIAS!!!!!!! -

1 Respuestas

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 de char* (Integer.m_opis). Relacionado ¿Qué es la regla de tres?
  • m_opis se establece dos veces en el constructor y todas las instancias de Integer tendrá la misma cadena "0" (lo mismo no significa el mismo búfer pero el mismo contenido). ídem para m_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

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.