2012-04-01 400 views
1

當我嘗試運行我的程序時,出現分段錯誤。有人能幫我找出我做錯了什麼嗎?分段錯誤,共享庫

與此編譯:

g++ sms_out.cpp -o sms_out 
    g++ -c -fPIC SMSDispatch.cpp 
    g++ -shared SMSDispatch.o -o libSMSDispatch.so 

它應該是一個共享庫和動態鏈接。當我嘗試運行sms_out時,出現分段錯誤。

//sms_out.cpp

#include <iostream> 
#include<cstdlib> 
#include<fstream> 
#include<sstream> 
#include<string> 
#include "SMSDispatch.h" 
using namespace std; 

string sms = ""; 

void sendSMS(string sms) 
{ 
    SMSDispatch* sPtr=0; 
    sPtr->sendSMS(sms); 
} 

int main(int argc, char *argv[]) 
{ 
    if(argv[1]) 
    { 
    string input = argv[1]; 
    string test = "--author"; 


if(input == test) 
    { 
     cout << "s149113" << endl; 
     return 0; 
    } 
    } 

    string line = ""; 
    string file = "sms_out.txt"; 
    ifstream myfile(file.c_str()); 


while(getline(myfile, line)) 
{ 
     string idnr, landcode, number, error; 
     istringstream linestream(line); 

     unsigned short errorcode; 

     //Split the sentence 
     getline(linestream, idnr, '\t'); 
     getline(linestream, landcode, ':'); 
     getline(linestream, number, '\t'); 
     getline(linestream, error); 

    if(idnr == "") break; 

    //Make string to int 
    try 
    { 
    errorcode = atoi(error.c_str()); 
    } 
    catch (exception &) 
    { 
    } 
    //Put together landcode and tlfnumber 
    string nr = landcode + number; 

    string txt = "Thank you for your vote!"; 
    if(errorcode == 100) txt = "Invalid question, please try again"; 
    else if(errorcode == 110) txt = "Sorry, only one vote pr. number"; 
    else if(errorcode == 200) txt = "Invalid alternative, please try again"; 
    else if(errorcode == 300) txt = "Missing a statement after other, please try again"; 
    else if(errorcode == 999) txt = "An error occurred, please try again"; 

    sms += "{\"ID\":" + idnr + ",\"nr\":" + nr + ",\"txt\":" + "\"" + txt + "\"" + "}\n"; 
    } 
    cout << sms << endl; 
    sendSMS(sms); 

}

//SMSDispatch.h

#include <string> 
#ifndef SMSDISPATCH_H 
#define SMSDISPATCH_H 
using namespace std; 

class SMSDispatch{ 
    public: 
    virtual void sendSMS(string json); 
    }; 
#endif 

//SMSDispatch.cpp

#include <iostream> 
#include <fstream> 
#include "SMSDispatch.h" 
using namespace std; 

/*virtual*/void SMSDispatch::sendSMS(string json) 
{ 
    ofstream myfile; 
    myfile.open ("sms_out.log"); 
    myfile << json; 
    myfile.close(); 
} 

int main() 
{ 

} 
+5

您的調試器告訴您關於段錯誤發生的具體位置? – Mat 2012-04-01 11:24:50

+2

原始代碼轉儲不是提問的高效方式。學習使用調試器(閱讀教程,購買書籍,參加課程);然後縮小您的問題並提出具體問題。 – 2012-04-01 11:26:59

+1

我沒有看到你用'libSMSDisplay.so'鏈接。 – trojanfoe 2012-04-01 11:28:16

回答

3

在你sendSMS功能sms_out.cpp聲明一個指針並對其進行初始化到零位(0)。下一行嘗試通過該指針訪問對象並調用成員函數。由於指針爲空(這意味着它不指向一個有效的對象),該操作wilth一個seg.fault

void sendSMS(string sms) 
{ 
    SMSDispatch* sPtr=0; // this sets pointer to null 
         // assign the address of a valid `SMSDispatch` object instead 
    sPtr->sendSMS(sms); 
} 

未能修復它,福斯特你需要一個類型的實例。

根據你的需要,你可以做

  • SMSDispatch dp; sPtr=&dp;
  • sptr=new SMSDispatch;

在第一種情況下,你也可以同樣做

SMSDispatch dp; 
dp.sendSMS(sms); 

在secons在你不需要後,你需要撥打delete sptr;再一次編輯對象。

此外,請注意,爲了編譯該程序,編譯器將需要SMSDispatch::sendSMS函數的定義。通過包含SMSDispatch.h標頭,您只提供聲明

你要麼需要

  • 加入-lSMSDispatch添加SMSDispatch.cpp爲代碼的直接包裝或
  • 鏈接的G ++ invokation agains共享庫G ++從建立共享庫後選擇SMSDispatch。cpp
+0

就像SMSDispatch * sPtr =&SMSDispatch; ?? – Veronic 2012-04-01 11:56:25

+0

由於'SMSDispatch'是一種類型,因此'&SMSDispatch'無效。你需要一個這種類型的實例。根據你的需要你可以做(​​1)'SMSDispatch dp; sPtr = &dp;'或(2)'sptr = new SMSDispatch;'在情況下(1),你可以做'SMSDispatch dp; dp.sendSMS(sms);',如果(2)你不需要這個對象,你需要調用'delete sptr;'。 – Attila 2012-04-01 13:22:08

+0

阿好,謝謝,但我試圖寫SMSDispatch DP; SMSDispatch * sPtr = &dp; sPtr-> sendSMS(sms);但後來我得到了一個錯誤:未定義的引用'vtable for SMSDispatch' – Veronic 2012-04-01 13:46:16

9

解引用一個指針NULL將導致一個segme ntation故障:

void sendSMS(string sms) 
{ 
    SMSDispatch* sPtr=0; 
    sPtr->sendSMS(sms); 
} 

我看不到一個理由使用動態分配的對象,因此建議改爲:

void sendSMS(string sms) 
{ 
    SMSDispatch sPtr; 
    sPtr.sendSMS(sms); 
}