我是一名系统工程专业的学生,而且我正在从我的大学完成作业。问题是我在我的一个程序中得到了上面提到的错误。程序必须获取一个文本文件并从中提取所有文本行,文本文件名作为参数在控制台上传递,一旦文本行被提取,我将它们存储在conversacion类上声明的静态向量上,然后角色对象必须从向量中获取一条线,如果接收到的线符合某些条件,则角色对象将返回带有角色的情绪,名称或年龄的接收线。
看起来错误在角色类上,删除主方法上的最后一个使我的程序运行完美。
代码如下:
int main(int argc, char * argv[]){
int iterador=0;
Conversacion * conversacion=new Conversacion();
Persona * persona1 = new Persona("David",21,"feliz");
Persona * persona2 = new Persona("John",24,"aburrido");
char linea[40];
string nomarchivo;
nomarchivo=argv[1];
ifstream archivo(nomarchivo.c_str());
while(!archivo.eof()){
archivo.getline(linea, 40);
string clinea(linea);
conversacion->getConversacion(clinea);
}
archivo.close();
/**This for is just meant to print the contents of the vector just to check if
is it ok, and yes it is.**/
for(int i=0; i<(conversacion->getVectorSize()-1); i++){
cout <<i+1 <<") "<<conversacion->getLinea(i)<< endl;
}
/**Deleting this while makes my program runs perfectly, the error
seems to be here but don't know what could it be**/
while(iterador<conversacion->getVectorSize()-1){
cout << persona1->sendResponse(conversacion, iterador)<<endl;
cout << persona2->sendResponse(conversacion, iterador)<<endl;
}
在conversacion.cpp文件中
Conversacion::Conversacion(){}
Conversacion::~Conversacion(){}
void Conversacion::getConversacion(string lineaIn){
conversacion.push_back(lineaIn);
}
string Conversacion::getLinea(int iteradorIn){
return conversacion[iteradorIn];
}
int Conversacion::getVectorSize(){
return conversacion.size();
}
在persona.cpp文件中
Persona::Persona(string nombreIn, int edadIn, string animoIn){
nombre=nombreIn;
edad=edadIn;
animo=animoIn;
}
Persona::~Persona(){}
string Persona::getNombre(){
return nombre;
}
int Persona::getEdad(){
return edad;
}
string Persona::getAnimo(){
return animo;
}
string Persona::sendResponse(Conversacion * &conversacionIn, int & iteradorIn){
string mensaje;
if(conversacionIn->getLinea(iteradorIn).compare("hola")){
mensaje=conversacionIn->getLinea(iteradorIn).append(conversacionIn->getLinea(iteradorIn+1));
iteradorIn++;
return "hola" + mensaje;
}else if(conversacionIn->getLinea(iteradorIn).compare("y como estas?")==0){
mensaje=conversacionIn->getLinea(iteradorIn);
iteradorIn++;
return animo + mensaje;
}else if(conversacionIn->getLinea(iteradorIn).compare("cuantos años tienes?")==0){
mensaje=conversacionIn->getLinea(iteradorIn);
stringstream edadc;
string stredad;
edadc << edad;
stredad=edadc.str();
iteradorIn++;
return stredad+ mensaje;
}else if(conversacionIn->getLinea(iteradorIn).compare("chao")==0){
iteradorIn++;
return "chao";
}
}
这是我在控制台上的错误:
Error in `./exe': free(): invalid pointer: 0x00007ffefe07dbf0 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7fb724f1b7e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x7fe0a)[0x7fb724f23e0a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7fb724f2798c]
./exe[0x402bb1]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7fb724ec4830]
./exe[0x401779]
答案 0 :(得分:0)
在你的代码的某个地方,你做了非法和未定义的事情(取消引用垃圾指针,索引数组的末尾,在删除或销毁之后访问某些内容,删除未创建的内容)用new,或删除两次)。为了弄清楚哪里出了问题,最好的工具可能是valgrind。
答案 1 :(得分:0)
我已经修好了,sendResponse
方法缺少else
条件,因此它无法进入没有条件满足的情况,也无法返回导致该条件的任何内容奇怪的错误。