2016-11-18 40 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)。将数据转换为这种形式的过程称为序列化。有些图书馆可以提供这方面的帮助,但标准图书馆没有任何内容。