由于未知原因,C ++应用程序崩溃了吗?

时间:2020-08-06 07:25:51

标签: c++ qt

我不知道为什么,但是我的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

1 个答案:

答案 0 :(得分:2)

std::stoll在无法进行转换时引发std::invalid_argument异常。这很可能是您正在崩溃的原因,特别是如果您的其他测试表明该字符串已经为空时。

Ui::ServerSys *serverSys;作为全局变量确实是一件很奇怪的事情,如果您已有ui作为成员变量在相同范围内可用,但至少应该 只要确实只有一个ServerSys实例 ,就不会造成任何麻烦。

到底出了什么问题?好吧,有两个可能的选择:

    在已删除的sendData()实例上调用了
  • ServerSys。给定代码,除非您尝试从Ui::ServerSys实例中可能还释放了的小部件实例中读取,否则您将不会注意到。
  • 您将以所需的形式进行更多行编辑,并且从错误的内容中读取了内容。仔细检查设计器中的小部件是否确实具有您的名字。

无论哪种方式,QString都有一个有用的方法toLongLong(),该方法不使用异常,因此您实际上应该直接使用该方法,而不要绕行try { std::stoll([...].toStdString()) } catch(...)

相关问题