[英]C++ application crashesbecause of unknown reason?
我不知道為什么,但我的 QT 應用程序每次都在//Error
(in last function of.cpp file) 注釋時崩潰。 你們知道為什么嗎? 不幸的是,我這里沒有調試器:/
服務器系統.cpp
#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());
}
服務器系統.hpp
#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
什么也沒有,也沒有 output。 對於所有測試,我當然在行編輯字段中寫了一些數字,例如123
。
當無法進行轉換時, std::stoll
會拋出std::invalid_argument
異常。 這很可能是您遇到的崩潰,特別是如果您的其他測試顯示字符串已經為空。
Ui::ServerSys *serverSys;
作為一個全局變量是一件非常奇怪的事情,如果你已經在同一個 scope 中擁有ui
作為成員變量,但至少只要真的只有一個ServerSys
實例就不會造成任何問題.
至於究竟出了什么問題? 好吧,兩個可能的選擇:
ServerSys
實例上調用了sendData()
。 給定代碼,除非嘗試從Ui::ServerSys
實例中也可能釋放的小部件實例中讀取,否則您不會注意到其他情況。 無論哪種方式, QString
都有一個有用的方法toLongLong()
不使用異常,所以你應該直接使用那個方法而不是try { std::stoll([...].toStdString()) } catch(...)
繞道而行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.