我不知道为什么,但是我的QT应用程序每次在&a
(。cpp文件的最后一个功能)注释中崩溃。你们知道为什么吗?不幸的是,我这里没有调试器:/
ServerSys.cpp
//Error
ServerSys.hpp
#include "ServerSys.hpp"
#include "ui_ServerSys.h"
#include "ServerNet.hpp"
#include <iostream>
#include <iomanip>
#include <sstream>
#include <math.h>
#include <algorithm>
#include <QDesktopWidget>
Ui::ServerSys *serverSys;
ServerSys::ServerSys(QWidget *parent) : QMainWindow(parent), ui(new Ui::ServerSys)
{
ui->setupUi(this);
serverSys = ui;
this->setFixedSize(QSize(811, 521));
this->setGeometry(QApplication::desktop()->screen()->rect().center().x() / 2, 500, 811, 521);
}
ServerSys::~ServerSys()
{
delete ui;
}
void ServerSys::sendData()
{
std::vector<long long> decTokens(8);
std::vector<std::string> binTokens(8);
std::vector<bool> binLabel;
long long decLabel;
getData(decTokens);
}
void ServerSys::getData(std::vector<long long> &decTokens)
{
//Error
decTokens[0] = stoll(serverSys->lineEdit_label_270->text().toStdString());
decTokens[1] = stoll(serverSys->lineEdit_sdi_270->text().toStdString());
decTokens[2] = stoll(serverSys->lineEdit_distance_270->text().toStdString());
decTokens[3] = stoll(serverSys->lineEdit_lsb_270->text().toStdString());
decTokens[4] = stoll(serverSys->lineEdit_msb_270->text().toStdString());
decTokens[5] = 0;
decTokens[6] = stoll(serverSys->lineEdit_ssm_270->text().toStdString());
decTokens[7] = stoll(serverSys->lineEdit_parity_270->text().toStdString());
}
由于我尝试使用手动调试
#ifndef SERVERUI_HPP
#define SERVERUI_HPP
#include <QMainWindow>
#include <vector>
#include <string>
QT_BEGIN_NAMESPACE
namespace Ui
{
class ServerSys;
}
QT_END_NAMESPACE
class ServerSys : public QMainWindow
{
Q_OBJECT
public:
ServerSys(QWidget *parent = nullptr);
~ServerSys();
void sendData();
private:
Ui::ServerSys *ui;
void getData(std::vector<long long>&);
};
#endif // SERVERUI_HPP
应用程序没有崩溃,但是std::string test = serverSys->lineEdit_label_270->text().toStdString();
std::cout << test << std::endl;
什么也没有崩溃,也没有输出。对于所有测试,我当然都在行编辑字段中写了一些数字,例如test
。
答案 0 :(得分:2)
std::stoll
在无法进行转换时引发std::invalid_argument
异常。这很可能是您正在崩溃的原因,特别是如果您的其他测试表明该字符串已经为空时。
Ui::ServerSys *serverSys;
作为全局变量确实是一件很奇怪的事情,如果您已有ui
作为成员变量在相同范围内可用,但至少应该 只要确实只有一个ServerSys
实例 ,就不会造成任何麻烦。
到底出了什么问题?好吧,有两个可能的选择:
sendData()
实例上调用了ServerSys
。给定代码,除非您尝试从Ui::ServerSys
实例中可能还释放了的小部件实例中读取,否则您将不会注意到。无论哪种方式,QString
都有一个有用的方法toLongLong()
,该方法不使用异常,因此您实际上应该直接使用该方法,而不要绕行try { std::stoll([...].toStdString()) } catch(...)
。