2013-05-08 2 views
0

나는 하루 종일이 일과 싸워 왔으며 QString, std :: string 및 char *를 여러 가지 다양한 방법으로 전달하려고 시도했지만, 라이브러리 함수 내에서 매개 변수의 값을 수정할 수 있도록 전달하십시오. 그런 다음 SEGFAULT가됩니다. 라이브러리 함수를 복사하여 기본 응용 프로그램에 줄을 입력하면 하루 종일 매개 변수로 참조를 전달하고 함수 내에서 값을 변경할 수 있습니다.SEGFAULT 라이브러리 함수에 대한 참조로 QString을 전달할 때

여기 내 라이브러리의 기능이 삭제되었습니다. 나는이 줄을 제외한 모든 코드를 문자 그대로 제거했다.

MySQLLib::ExecuteQuery(const QString& query, QString& results) 
{ 
    results = "Changed the value of this parameter."; 
} 

여기에 주 응용 프로그램의 호출 코드가 있습니다. bmdbTest는 위의 MySQLLib 클래스의 인스턴스입니다 ... 내 라이브러리 및 응용 프로그램의 다른 모든 코드가 작동합니다. 그것은 단지 내 라이브러리에 아무것도 언급하지 못하게합니다.

MySQLProj::pbExecuteQuery_Click() 
{ 
    QString x = "Hello."; 
    bmdbTest->ExecuteQuery("SELECT ttid from test_table", x); 
    ui_MySQLProj1.textEdit->setText(x); 
} 

bmdbTest-> ExecuteQuery 호출시 SEGFAULT가됩니다. 나는 간단한 정수인 &을 매개 변수로 사용해도 성공하지 못했습니다. 그러나 const QString & 같이 문제없이 매개 변수를 전달할 수 있습니다. 그런 식으로 매개 변수의 값을 수정할 수 없습니다.

편집 : 방금 알아 냈습니다. "paxdiablo"에 null 또는 잘못된 포인터에 대한 변수를 확인해 주셔서 감사합니다. 나는 지난 밤에 정말로 피곤했다. 그리고 나는 이것을 놓쳤다라고 생각할 수 없다.

방금 ​​문제가 발견되어 완전히 바보가되었습니다. bmdbTest가 null이거나 유효하지 않다고 언급했습니다. bmdbTest의 값은 다른 모든 함수가 잘 작동 했으므로 괜찮 았지만 ExecuteQuery()를 호출 할 때 QLineEdit의 값에서 쿼리 문자열을 내 GUI 창에서 전달하고있었습니다.

bmdbTest->ExecuteQuery(leQuery->text(), resultString); 

leQuery-> Text()는 이와 같이 leQuery에 액세스해야하므로 실제로 문제가있었습니다.

bmdbTest->ExecuteQuery(ui_MySQLProj1.leQuery->text(), resultString); 

답변

1

bmdbTest 자체의 값을 확인할 수 있습니다. null 또는 무효 인 포인터 일 가능성이있다.

실제로는 에 오류가 있음을 나타내는 것으로 보입니다. 행입니다. 매개 변수에 대해 의심스러운 것이 있으면 ExecuteQuery 함수 내에서 오류가 발생할 것으로 예상됩니다.

당신은 충돌이 results = ...bmdbTest->ExecuteQuery(...) 라인의 양쪽에 (홍조와) 적절한 디버그 문을 넣어이다 정확히을 찾을 수 (또는 한이있는 경우 디버거를 사용)해야한다.

관련 문제