2016-04-15 66 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,所以當它們完成後,它們都會釋放它。

解決的辦法是選擇一個,讓它,只有它,擁有工廠。這裏有一種方法:

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++應用程序時遇到困難,因爲大多數時候錯誤消息並不意味着對我有用。如果錯誤是例如一個沒有任何詳細錯誤信息的分段錯誤。 – TorbenJ

+1

@TorbenJonas有很多不同的方法可以調試這類問題。分析故障發生點(核心文件的驗屍調試)是一種方法。就我個人而言,我不會使用通過傳遞裸指針實現所有權轉讓的C++庫,除非我別無選擇。在這個特殊情況下,我通過代碼檢查發現了這種情況 - 我看到代碼通過一個裸指針傳遞給它擁有的一個對象,並且知道這是可能的罪魁禍首。 (如果您應該這樣做,該功能可能需要參考。) –

相關問題