2017-03-31 11 views
0

私はlibmodbusライブラリを使用しています。私はスレッド間でmodbus_tポインタのインスタンスを渡す必要があります。私は生のポインタだけでは問題があります。私はboost_shared_ptrをカスタムディレターで使用して問題を解決できると思います。ブースト共有ポインタカスタムデリータの例

コンパイラの問題はありませんが、プログラムを実行するとクラッシュします。 私は誰かが私にカスタムのデリゲーターを使ってブースト共有ポインターの使用例を与えることができればと思っていました。

OpenModBusConnection()関数でm_mb.reset()が初めて呼び出されたときにプログラムがクラッシュします。私が手

m_mb = boost::shared_ptr<modbus_t>(modbus_new_rtu(m_heatercomport.c_str(),9600,'N',8,1), freemodbus); 

    void freemodbus(modbus_t *mb) 
    { 
     if(mb != NULL) 
     { 
      modbus_close(mb); 
      modbus_free(mb);  
     } 
    } 

    void OpenModBusConnection() 
    { 
     if(m_mb.get() != NULL) 
     {   
      wxString msg("Closing port \""); 
      msg.append(m_heatercomport); 
      msg.append("\" modbus port "); 
      wxLogMessage(msg); 

      readoutput->AppendText("Modbus Connection Closed\n"); 

      m_mb.reset(); 

     } 

     // open modbus connection 
     m_mb.reset(); 
     modbus_set_slave(m_mb.get(),1); 

     if(modbus_connect(m_mb.get()) == -1) 
     { 
      wxString msg("Failed to open port \""); 
      msg.append(m_heatercomport); 
      msg.append("\" modbus port "); 
      wxLogMessage(msg); 

      readoutput->AppendText("Modbus Connection Failed\n"); 

      return false; 
     } 
     else 
     { 
      wxString msg("Opening port \""); 
      msg.append(m_heatercomport); 
      msg.append("\" modbus port "); 
      wxLogMessage(msg); 

      readoutput->AppendText("Modbus Connection Established\n"); 

      return true; 
     } 
    } 

エラーメッセージは、解放し、新鮮なMODBUSのハンドルに戻ってm_mbをリセットしたい場合はこれが効果的に

m_mb.reset(); 
modbus_set_slave(nullptr,1); 

if(modbus_connect(nullptr) == -1) 

と同じである

First-chance exception at 0x7717bb47 in test.exe: 0xC0000008: An invalid handle was specified. 

答えて

1
m_mb.reset(); 
modbus_set_slave(m_mb.get(),1); 

if(modbus_connect(m_mb.get()) == -1) 

ですあなたがする必要があります

m_mb = boost::shared_ptr<modbus_t>(modbus_new_rtu(m_heatercomport.c_str(),9600,'N',8,1), freemodbus); 

再び明示的に。

関連する問題