2016-04-15 11 views
0

私はPocoで遊んでいて、簡単なTCPサーバクライアントアプリケーションを構築しようとしています。
この例ではClientの唯一のタスクは、すべての受信データを送信者にエコーバックすることです。
私がコンパイルされたアプリケーションを実行すると終了時に、私は、次のメッセージが表示されます:シンプルなPoco TCPネットワーキングアプリケーションのコアダンプ

*** Error in `./gameserver': free(): invalid pointer: 0x00007ffd4896cbf8 *** 
Aborted (core dumped) 

私は本当にここでの問題を理解していません。私はそれがPocoコードの一部と関係があると思います。私はPocoのものを使用するときに重要な何かを見逃しています。

誰かが私のコードで何が間違っているか教えていただけたらいいですか?

コード:

class Client : public TCPServerConnection 
{ 
public: 
    explicit Client(const StreamSocket &socket) 
     : TCPServerConnection(socket) 
    { 
    } 

    ~Client() 
    { 
     socket().close(); 
    } 

    void run() 
    { 
     char buffer[256]; 
     int n = socket().receiveBytes(buffer, 256); 
     while(n > 0) 
     { 
      socket().sendBytes(buffer, n); 
      n = socket().receiveBytes(buffer, 256); 
     } 
    } 
}; 

class Factory : public TCPServerConnectionFactory 
{ 
public: 
    TCPServerConnection* createConnection(const StreamSocket &socket) 
    { 
     return new Client(socket); 
    } 
}; 

class Server 
{ 
public: 
    explicit Server(const string &endpoint) 
     : address(endpoint), socket(address), factory(), server(&factory, socket) 
    { 
     server.start(); 
    } 

    ~Server() 
    { 
     server.stop(); 
    } 

private: 
    SocketAddress address; 
    ServerSocket socket; 
    TCPServer server; 
    Factory factory; 
}; 

int main() 
{ 
    { 
     Server server("localhost:5556"); 
     cin.get(); 
    } 
} 

答えて

1

問題はFactoryの二重の自由です。 ServerTCPServerのオブジェクトは両方ともFactoryを所有しているため、両方とも完了したら解放します。

解決方法は、1つを選択して、それだけを工場に所有させることです。ここには1つの方法があります:

class Server 
{ 
public: 
    explicit Server(const string &endpoint) 
     : address(endpoint), socket(address), server(new Factory(), socket) 
    { 
     server.start(); 
    } 

    ~Server() 
    { 
     server.stop(); 
    } 

private: 
    SocketAddress address; 
    ServerSocket socket; 
    TCPServer server; 
}; 
+0

ありがとうございます!私はあなたがこれの原因をどのように見つけたのか知りたいですか?ソースを知っていたか、ツールを使ったことがあるので、事前に知っていましたか?ほとんどの場合、エラーメッセージは私にとって有用なものではないので、私はしばしばC++アプリケーションのデバッグに問題があります。エラーが例えば1である場合、それはさらに悪化する。詳細なエラーメッセージがまったくないセグメンテーションエラーです。 – TorbenJ

+1

@ TorbenJonasこの種の問題をデバッグする方法はたくさんあります。障害が発生した時点(コアファイルの死後のデバッグ)の分析は1つの方法です。個人的には、選択肢がなければ、裸のポインタを渡して所有権の移譲を実装したC++ライブラリを使用しません。この特定のケースでは、私はコード検査でそれを理解しました。ライブラリ関数に所有されているオブジェクトに裸のポインタを渡し、それが原因である可能性が高いことを知っていました。 (もしあなたがそうしなければならないなら、その関数は参考になるでしょう)。 –

関連する問題