首页 > 解决方案 > 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.

标签: c++qt

解决方案


std::stollstd::invalid_argument无法进行转换时抛出异常。这很可能是您遇到的崩溃,特别是如果您的其他测试显示字符串已经为空。

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

至于究竟出了什么问题?好吧,两个可能的选择:

  • sendData()ServerSys在已删除的实例上调用。给定代码,您不会注意到其他情况,除非尝试从您的实例中也可能释放的小部件实例中读取Ui::ServerSys
  • 您以您想要的形式进行了更多的行编辑,并且您从错误的行中读取。仔细检查设计器,如果小部件确实具有您的名称,尽管它们确实如此。

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


推荐阅读