为什么这次调用QFtp.put会导致崩溃?

时间:2012-03-06 20:25:03

标签: c++ qt ftp

我正在尝试使用QFtp将.avi文件上传到FTP服务器:

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连接,也会发生崩溃。该文件永远不会进入服务器。

1 个答案:

答案 0 :(得分:5)

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

file驻留在堆栈上。成员函数file返回后,void MyFTP::recordingDone(QString &fileName)的生命周期结束。但是qftp仍然提到它。当您尝试访问不再存在的file时,这可能会导致崩溃。而是在堆上分配file