当前位置: 首页 > 知识库问答 >
问题:

为什么“这个”是空的?c分段故障[关闭]

丌官开宇
2023-03-14

我正在构建一个Qt应用程序,它因为分段错误而崩溃。经过调查,我发现segfault的原因是“this”为空,我试图访问readInputFile(QString path)方法中的成员变量。在这一行中,输入=行

我不明白为什么会这样。“这个”怎么可能是空的?

这里是创建对象的地方

void MainWindow::on_inpFileCheck_clicked()
{
    if (ui->inpFileCheck->isChecked()) {
        QString filePath = QFileDialog::getOpenFileName(this,tr("Open CSV file"), "/home", tr("CSV  (*.csv)"));
        myAlgo->readInputFile(filePath);
        ui->inputEdit->clear();
        ui->inputEdit->appendPlainText(myAlgo->getInput());
    }
}

下面是BaseAlgorithm头

#include "qstring.h"
#include "qmainwindow.h"

class BaseAlgorithm
{
public:
    BaseAlgorithm();
    QString readInputFile(QString);
    int lenArr;

private:
    QString input;
    QString output;
};

这里是实现和问题发生的地方

#include "basealgorithm.h"
#include "qfile.h"
#include "qtextstream.h"

BaseAlgorithm::BaseAlgorithm() {

    numComparisons = 0;
    input = "";
    output = "";
    intArr = NULL;
}

QString BaseAlgorithm::readInputFile(QString path) {

    QFile inpFile(path);
    if (inpFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
        QTextStream in(&inpFile);

        while (!in.atEnd()) {
            QString line = in.readLine();
            input += line; // crash happens here
        }
        return input;
    }

    else {
         return "ERROR";
    }

}

共有3个答案

郑嘉年
2023-03-14

我修好了。该对象创建时间较晚。

郎磊
2023-03-14
匿名用户

很明显< code>this是NULL,因为< code>myAlgo在被调用的地方是NULL。所以这里题目问的问题得到了回答。

为什么<code>myAlgo<code>为空?我们不知道,因为你没有显示代码。

戚阳文
2023-03-14

在C中,完全可以通过指向对象的空指针调用方法。只要this没有实际取消引用,该函数就可以正常工作。

更新:该行为通常由实现表现出来,因为<code>这<code>通常被视为编译代码中的另一个参数。然而,正如@manni66所指出的,该标准实际上并不强制要求在<code>null ptr</code>上调用方法的结果。

 类似资料:
  • 顺着我之前的一个问题,大部分评论都说“就是不要,你处于冷宫状态,你要杀光一切,重新开始”。还有一个“安全”的变通方法。 我不明白的是为什么分割错误本质上是不可恢复的。 写入受保护内存的时刻被捕获-否则,不会发送。 如果能够捕捉到写入受保护内存的时刻,我不明白为什么——理论上——它不能在某个低级别上恢复,并将SIGSEGV转换为标准软件异常。 请解释为什么在出现分段错误后,程序处于不确定状态,因为很

  • 正在尝试读取输入。txt文件,并使用fscanf将行内容存储到int变量、数组和2D数组中,以便以后使用该值进行计算。我认为这里的问题是因为我没有使用fscanf处理“EOF”? 这是我的密码: 这是你的电话号码。txt输入文件: 这里是输出:

  • 编辑:底部的工作代码 我对编程相对较新,我正在试图理解为什么这不起作用。我决定通过一个函数而不是来处理卡片,以保持它尽可能模块化。这是我下面的代码;我知道错误与指针有关,但我不明白我做错了什么。 工作代码:

  • 问题内容: 我有一个用于捕获任何分段错误或ctrl- c的应用程序。使用下面的代码,我能够捕获分段错误,但是该处理程序一次又一次地被调用。我该如何阻止他们。供您参考,我不想退出我的申请。我只是可以小心释放所有损坏的缓冲区。 可能吗? 处理程序就是这样。 在这里,对于Segmentation故障信号,处理程序被多次调用,并且很明显MyfreeBuffers()给我释放已释放的内存的错误。我只想释放一

  • 我有一个便宜的5美元/月的服务器,1G内存为我的网站处理一些图像。在将GIF图像写入磁盘时,我很少会遇到PHP Imagick的分割错误。 我在console命令上设置了一个内存限制,希望PHP能够首先捕获这个问题,并抛出一个我可以正确处理的异常,但这不起作用。 特别的问题是某些GIF图像会导致它在这行代码中崩溃: 特定的GIF是与成人相关的GIF,因此我不确定是否可以共享它。 以下是我的服务器日

  • 我有一个应用程序,我用它来捕捉任何分割错误或ctrl-c。使用下面的代码,我能够捕获分段错误,但是处理程序被一次又一次地调用。我怎样才能阻止他们。告诉你,我不想退出我的申请。我只是可以小心释放所有损坏的缓冲区。 可能吗? handler是这样的。 这里的分段故障信号,处理程序被多次调用,因为明显的MyFreeBuffers()给我释放已经释放的内存的错误。我只想免费一次,但仍然不想退出应用程序。