2016-11-18 80 views
-1

我有2個不同的應用程序,一個發件人和一個接收程序。發件人將發送一條消息給接收者,接收者將解碼消息並打印到控制檯。但是,我不斷收到分段錯誤錯誤。C++分段錯誤 - 兩個應用程序之間的消息

發送者和接收者的應用程序具有相同的TestContainer.h和TestContainer.cpp。

鑄造方法

template<class To,class From>To cast(From v) 
{ 
     return static_cast<To>(static_cast<const void*>)(v); 
} 

Sender應用程序

int main() 
{ 
    TestContainer tc; 
    tc.setDesc("this is a message"); 
    const char* castedData = cast<const char*>(&tc); 

    const TestContainer test_tc = cast<const TestContainer*>(castedData); 

    // i get back "this is a message",so the casting is working 
    cout << "message content: " << test_tc->getDesc() <<endl; 

    TaoSender;  
    TaoSender.send(castedData);  

    return 1; 
} 

接收機中的應用

void push(const RtecEventComm::EventSet& events) 
{ 
    const char* receivedData; 
    events[0].data.any_value >>= receivedData; 

    cout << "data received: " << receivedData << endl; 

    const TestContainer rcv_tc = cast<const TestContainer*>(receivedData); 

    cout << "message content: " << rcv_tc->getDesc() <<endl; // error(segmentation fault) 
} 

TestContainer.h和TestContainer.cpp

class TestContainer{ 
    public 
     TestContainer(); 
     virtual ~TestContainer(); 
     const std:string& getDesc() const { 
      return desc; 
     } 
     void setDesc(const std::string& desc) { 
      this->desc = desc; 
     } 
    private 
     std::string desc; 
} 



#include TestContainer.h 

TestContainer::TestContainer(){} 
TestContainer::~TestContainer(){} 

castedData在發送方的值和receivedData在接收方的值是一樣的,所以我猜消息發送是正確的。

但是,在接收器,在將receivedData緩衝區轉換爲Testcontainer指針並嘗試訪問desc後,出現分段錯誤錯誤。

我也嘗試在發件人的鑄造回Testcontainer,我能夠訪問desc。那麼我錯過了什麼?

+1

你不應該強制轉換數據,你需要將一個char *轉換爲一個類,這就是問題。 –

+0

這段代碼有一些基本的語法錯誤,例如'return static_cast (static_cast >「和錯位的圓括號。請在自包含的示例中發佈實際代碼([MCVE])。 – davmac

+0

這看起來並不像一個CORBA程序,檢查TAO –

回答

1

雖然你的問題的代碼有錯誤,如果我理解正確,你正在試圖通過管道或其他渠道推送對象表示到另一個進程,在那裏你重建對象,並嘗試使用它。

你可以用「普通舊數據」對象做到這一點,但TestContainer類有虛擬方法,因此它不是POD。在大多數C++實現中,TestContainer類型的對象將包含一個vtable指針,它指向在進程地址空間內分配的表。該表的地址在不同的流程中可能會有所不同。因此,當您嘗試調用虛擬方法時,將TestContainer對象的表示字節逐字節複製到另一個進程將導致崩潰。

TestContainer情況下還包含std::string。 A string分配存儲空間來保存字符串內容,並且這個存儲空間將在對象本身之外。將string的字節表示作爲TestContainer的一部分進行發送會導致在string的另一端重構,該持有指向另一個進程中的存儲器地址的指針。在接收器中,該內存地址將指向其他內容。因此,string將不會被成功重建。

要在進程之間發送對象,您需要以獨立於內部存儲器地址的形式正確傳輸它們(無論是vtable指針,指針成員還是不透明成員的指針成員,例如string)。將數據轉換爲這種形式的過程稱爲序列化。有些圖書館可以提供這方面的幫助,但標準圖書館沒有任何內容。

相關問題