为什么我得到" ./ exe:free():无效的指针"错误?

时间:2016-11-13 18:25:46

标签: c++ pointers runtime-error

我是一名系统工程专业的学生,​​而且我正在从我的大学完成作业。问题是我在我的一个程序中得到了上面提到的错误。程序必须获取一个文本文件并从中提取所有文本行,文本文件名作为参数在控制台上传递,一旦文本行被提取,我将它们存储在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]

2 个答案:

答案 0 :(得分:0)

在你的代码的某个地方,你做了非法和未定义的事情(取消引用垃圾指针,索引数组的末尾,在删除或销毁之后访问某些内容,删除未创建的内容)用new,或删除两次)。为了弄清楚哪里出了问题,最好的工具可能是valgrind

答案 1 :(得分:0)

我已经修好了,sendResponse方法缺少else条件,因此它无法进入没有条件满足的情况,也无法返回导致该条件的任何内容奇怪的错误。