2016-11-13 19 views
-1

我是一名系統工程學生,我正在從我的大學完成一項任務。事情是我在我的程序中遇到了上面提到的錯誤。該程序必須獲取一個文本文件並從中提取所有文本行,文本文件名作爲控制檯上的參數傳遞,一旦提取了文本行,我將它們存儲在一個在conversacion類中聲明的靜態向量上,然後角色對象必須從矢量中獲得一條直線,並且如果它接收到的直線符合特定條件,那麼角色對象將返回接收到的具有角色的情緒,名稱或年齡的直線。爲什麼我會得到「./exe:free():Invalid Pointer」錯誤?

貌似錯誤是在人物類,刪除最後一個,而在main方法讓我的程序運行非常好。

的代碼如下:

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

一個奇怪的是,在'sendResponse'你'iteradorIn ++;'* *後的'return'聲明。這意味着增量不會發生,因爲您已經返回到調用函數。 –

+0

請[編輯]您的問題以提供[mcve]。 –

+0

@BoPersson你說得對,已經糾正了我的錯誤 –

回答

0

某處在你的代碼,你正在做一些非法的和不確定的(解引用指針的垃圾,關閉索引數組的末尾,則刪除或銷燬後訪問的東西,刪除那些不是用新創造的,或刪除兩次)。要弄清楚哪裏出了問題,最好的工具可能是valgrind

0

我已經修復它,sendResponse方法缺少else條件,所以它無法進入沒有條件滿足的情況,也無法返回任何導致奇怪錯誤的情況。

相關問題