Soy un principiante en c ++, y comencé a escribir un programa de c ++ muy básico:

class Solution {
    public:
    vector<string>  fct(vector<string>& list1);
};

vector<string> Solution::fct(vector<string>& list1)
{
   vector<string>::iterator it;
   //vector<string> *ret = new vector<string>;
   for (it=list1.begin();
     it!=list1.end();
     it++)
    {
        cout<<(*it)<<endl;
    }
    //return(*ret); /*This resolved the problem*/
}

Una llamada a la función fct causa una falla de segmentación cuando fct regresa:

int main()
{
Solution s;
vector<string> list1;

list1.push_back("X");
list1.push_back("Y");
list1.push_back("Z");

s.fct(list1);
}
  • cuando cambio el tipo de retorno de int no hay problema.
  • devolver vector<string> de fct también ha resuelto el problema.

Estoy pidiendo una explicación de este comportamiento.

c++
-5
Mouin 27 jun. 2017 a las 01:14

2 respuestas

La mejor respuesta

Omitir la instrucción return de una función cuyo tipo de retorno no es void es causa de un comportamiento indefinido.

cuando cambio el tipo de retorno de int no hay problema.

Esa es una forma válida de comportamiento indefinido. Puede considerarse afortunado / desafortunado dependiendo de cómo lo veas. Lo considero desafortunado ya que el problema permanece oculto.

devolver vector<string> desde fct también ha resuelto el problema.

Esa es la forma correcta de implementar una función que se supone que devuelve un vector<string>.

2
R Sahu 26 jun. 2017 a las 22:21

En línea:

 list2 = s.fct(list1);

Estás asignando un valor a 'list2'. Por lo tanto, debe devolver un tipo compatible de la función 'fct ()'. Como está devolviendo un tipo incompatible, por lo tanto, está causando un error de segmentación.
Nota Si no devuelve un valor de una función y el tipo de retorno de la función es int, devuelve cualquier valor int.

0
cse 26 jun. 2017 a las 22:24