2011-05-02 32 views
7

Ok ... estoy rasgando mi pelo ... ¿Por qué recibo Fauls segmentación cuando estoy pasando una cadena denominada "nombre" que contiene "Joel" enPrograma recibió SIGSEGV señal, Fallo de segmentación

void person::setName(string newName) 
{ 
    personName = newName; 
} 
archivo

Cabecera:

class person { 
public: 
    int getID(); 
    string getName(); 

    void setID(int newID); 
    void setName(string newName); 
private: 
    int personID; 
    string personName; 

}; 

por cierto ... la llamada de función es por un niño, aunque no veo cómo eso podría causar un problema.

+0

También ... Se ejecuta en iteraciones previas sin falla ... Simplemente no me gusta esta iteración ... Me gustaría vincular el código, pero hay cubos de las cosas X ( – falconmick

+1

No creo que su problema es esa función . Es posible que desee ver cómo está creando/accediendo a la persona objeto que está utilizando. –

+0

Su ejemplo de código está bien, el segfault es causado en otro lugar. Pase por su código con un depurador para encontrar la línea de código. causando el error –

Respuesta

1

Probablemente, está desreferenciando un puntero deshonesto. Por pura conjetura, ¿tienes algo como esto, tal vez:

Person persons[10]; 

for (i=1; i<=10; i++) 
    persons[i].setName("joel"); 

El problema podría ser:

  • el error como se muestra, el índice está basado en 0, por lo que necesita for (i=0; i<10; i++)
  • si la matriz se asigna dinámicamente, pero el índice aún está fuera de los límites

Podría haber literalmente cientos de otras causas, pero como no tengo su código, esta es mi una intentar descubrir los errores más plausibles;)

(Nota para mí: ¿por qué estoy haciendo esto/no soy vidente?)

17

Si está en Linux, intente ejecutar valgrind. Que acaba de compilar con -g (con gcc), y luego ejecutar su programa con valgrind delante:

$ valgrind myprogram 

A diferencia de las soluciones del CCG, que le indican cuándo se produce la violación de segmento, valgrind por lo general le dice exactamente cuando el primer corrupción de memoria ocurre, por lo que puede detectar el problema mucho más cerca de su origen.

PS. Rima con "pedernal", no "buscar".

+2

+1 para dar la pronunciación correcta de valgrind ('valgreend') –

-2

El código se ve bien aparte del hecho de que está copiando cadena todo el tiempo. En lugar de

void setName(string newName); 

debe ser

void setName(const string& newName); 

El tema debe estar en la invocación del método.

+0

-1: Usted solo dijo que "se ve bien" sin ningún intento de resolver el problema. El pequeño detalle que proporcionó es casi irrelevante, porque si la cadena se copia una o dos veces no debería tener ningún impacto aquí. En el mejor de los casos, su publicación debe ser un comentario a la pregunta original. Es probable que no tenga los puntos necesarios para hacer comentarios, solo intente responder para obtener algunos puntajes, pero hágalo de forma razonable. Esta pregunta (y su respuesta también) carece de detalles y es bastante improbable que ayude a nadie en el futuro. Es altamente improbable que puntúes en esta publicación y con respuestas a los comentarios. – quetzalcoatl

+0

"El problema debe estar en la invocación al método". lo que significa que el código es pobre, pero no tiene errores. – user3849792

Cuestiones relacionadas