簡體   English   中英

C++ 應用程序由於未知原因而崩潰?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM