c++ - C++ 应用程序由于未知原因而崩溃?
问题描述
我不知道为什么,但我的 QT 应用程序每次在//Error
(在 .cpp 文件的最后一个函数中)注释时都会崩溃。你们知道为什么吗?不幸的是,我这里没有调试器:/
服务器系统.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
什么也没有,也没有输出。对于所有测试,我当然在行编辑字段中写了一些数字,例如123
.
解决方案
std::stoll
std::invalid_argument
无法进行转换时抛出异常。这很可能是您遇到的崩溃,特别是如果您的其他测试显示字符串已经为空。
Ui::ServerSys *serverSys;
作为一个全局变量是一件非常奇怪的事情,如果你已经ui
在同一个范围内有一个可用的成员变量,但至少只要真的只有一个实例就不会造成任何麻烦。ServerSys
至于究竟出了什么问题?好吧,两个可能的选择:
sendData()
ServerSys
在已删除的实例上调用。给定代码,您不会注意到其他情况,除非尝试从您的实例中也可能释放的小部件实例中读取Ui::ServerSys
。- 您以您想要的形式进行了更多的行编辑,并且您从错误的行中读取。仔细检查设计器,如果小部件确实具有您的名称,尽管它们确实如此。
无论哪种方式,QString
都有一个toLongLong()
不使用异常的有用方法,因此您应该直接使用该方法而不是try { std::stoll([...].toStdString()) } catch(...)
绕道而行。
推荐阅读
- php - HTML 表单 + PHP + MYSQL 500 错误
- express - nginx 代理传递快速路由
- javascript - 无法使用 RegEx 从未定义中读取属性“0”
- sql-server - 多连接 Tsql 合并低效代码
- microsoft-cognitive - QnA Maker - 无法与他人协作
- android - 任务':react-native-custom-tabs:transformDexArchiveWithExternalLibsDexMergerForDebugAndroidTest'的执行失败
- cassandra - 在现有的生产 cassandra 集群中添加新的密钥空间
- c - 为什么我的 for 循环增量变化很大?
- azure - Azure Functions - 队列触发器在失败时使用消息
- python - Numpy 维度的健全性检查?