2017-12-09 25 views
-2

"this"가 왜 NULL입니까? C++ 분할 오류

저는 세그먼트 화 오류로 인해 Qt 앱을 빌드 중이며 충돌합니다. 조사가 끝난 후 segfault의 원인은 "this"가 NULL이며 readInputFile (QString path) 메서드에서 멤버 변수에 액세스하려고한다는 것을 알았습니다. 이 라인에 input += line;

왜 이런 일이 일어나는지 이해가되지 않습니다. "this"가 어떻게 NULL이 될 수 있습니까? 객체가 여기에

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"; 
    } 

} 
일어나는 곳 어디 여기

입니다

+0

어디에서 충돌이 발생합니까? – DeiDei

+0

@DeiDei 업데이트. readInputFile() 메소드에서. 이 행'input + = line; ' –

+0

'BaseAlgorithm'이 어디서 어떻게 생성되는지 알지 못해도 말하기가 어렵습니다. 나는 너 자신 [mcve]을 만드는 것이 좋습니다. 문제가있는 곳과 문제를 해결하는 방법이 표시되지 않으면 질문의 코드를 제거하고 MCVE로 교체하십시오. – user4581301

답변

0

해결했습니다. 개체가 늦게 생성되고있었습니다.

3

C++에서는 객체에 대한 널 포인터를 통해 메소드를 호출 할 수 있습니다. this이 실제로 참조 해제되지 않는 한 함수는 정상적으로 작동합니다.

업데이트 : 일반적으로 this은 컴파일 된 코드에서 다른 매개 변수로 취급되기 때문에 구현시 자주 나타나는 동작입니다. 그러나 @ manni66에서 지적한 것처럼 표준은 실제로 nullptr에서 메소드를 호출 한 결과를 위임하지는 않습니다.

+3

그것은 UB입니다. 이 기능은 당신이 기대하는 것을 할 수 있지만 ** 보증은 없습니다 ** –

+0

오늘 아주 재미있는 것을 배웠습니다. –

+0

객체가 가상 함수를위한 vtable을 가지고 있다고 가정하면 이상한 일이 발생합니다. –

1

myAlgo이 호출되면 NULL이기 때문에 this이 NULL이라는 것이 명백합니다. 그래서 여기서 제목에 묻는 질문에 답이 나옵니다.

myAlgo이 NULL입니까? 당신이 그 코드를 보여주지 않았기 때문에 우리는 모른다.