2012-03-06 74 views
0

我想上傳一個.avi文件到FTP服務器QFtp:爲什麼這個調用QFtp.put導致崩潰?

void MyFTP::recordingDone(QString &fileName){ 
remainingFiles.push_back(new QString(fileName)); 

commands[qftp.connectToHost(globalProperties.ftpServer)] = "connect to host"; 
commands[qftp.login(globalProperties.ftpUsername,globalProperties.ftpPassword)] = "login"; 
commands[qftp.cd("myapp")] = "cd myapp"; 
commands[qftp.cd("Videos")] = "cd videos";  
QDir().cd(globalProperties.videoStorageLocation); 
qDebug()<<"Opening "<<fileName<<endl; 
if(QFile::exists(fileName)){ 
    qDebug()<<"File exists"<<endl; 
} 
else{ 
    qDebug()<<"File does not exist"<<endl; 
} 
QFile file(fileName); 
qDebug()<<"putting"<<endl; 
qftp.put(&file,fileName); 
qDebug()<<"Closing ftp"<<endl; 
qftp.close(); 
} 

我連接到命令完成信號和使用的插槽調試輸出信息:

void TrusionFTP::ftpCommandDone(int id, bool error){  
qDebug()<<"command: "<<commands[id]<<": "<<error; 
if(error){ 
    qDebug()<<qftp.errorString()<<endl; 
    if (qftp.hasPendingCommands()){ 
     qDebug()<<"Pending commands"<<endl; 
    } 
} 
} 

這裏是在飛機墜毀前的輸出:

Opening "2012-Mar-06-12-19-57.avi" 

File exists 

putting 

Closing ftp 

command: "connect to host" : false 
command: "login" : false 
command: "cd trusion" : false 
command: "cd videos" : false 

崩潰也會發生,如果我不關閉FTP連接。該文件永遠不會進入服務器。

回答

5
QFile file(fileName); 
ids.push_back(qftp.put(&file,fileName)); 

file駐留在堆棧上。一旦成員函數void MyFTP::recordingDone(QString &fileName)返回,file的生存時間結束。但qftp仍然參考它。當您嘗試訪問不再存在的file時,這可能會導致您崩潰。改爲在堆上分配file

+0

這也適用於Qt的其他語言綁定,特別是垃圾收集語言,例如。 PyQt for Python。需要保留對「QFile」或任何其他正在使用的「QIODevice」對象的引用。 – Archimedix 2014-09-18 13:25:40