2012-10-16 89 views
1

我正在使用Boost ASIO套接字與Linux下的某些遠程設備進行通信,但是當端點無法訪問時我遇到了問題。首先,這裏是一個說明該問題的代碼部分:Boost ASIO套接字消耗文件描述符

try { 
    if(mysocket == NULL) 
    { 
     mysocket = new boost::asio::ip::tcp::socket(io_service); 
    } 
    mysocket->connect(boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("192.168.0.12"), 1)); 
    printf("connected\n"); 
    return 0; 
} 
catch (std::exception &e) 
{ 
    boost::system::error_code ec; 
    mysocket->close(ec); 
    delete mysocket; 
    mysocket = NULL; 
    printf("not connected %s\n", e.what()); 
} 

利用這段代碼我的班級裏,我得到類型eventfd的文件描述符的越來越多,直到使用所有可用的防衛和安全應用程序崩潰。上面的代碼有問題嗎?爲什麼boost不關閉文件描述符?我甚至刪除了套接字! 在此先感謝!

+0

我試圖在無限循環中運行你的代碼,它不會導致任何資源泄漏(boost 1.51,MSVC10,Win7)。您能否詳細說明您的真實情況? –

+0

我想我解決了這個問題,它不應該與boost相關,但是對於其他人在基類中不使用虛擬析構函數的代碼!這阻止了一些清理工作的執行,從而留下了一些東西。不知道這是否解決了這個問題,首先得先測試一下,但我想我的方式很好! – cpl

+0

你確定你沒有泄漏內存嗎?爲什麼不使用'std :: shared_ptr'而不是裸mysocket'指針? –

回答

1

問題是由於沒有釋放資源,比如boost套接字。這些套接字留下了打開的文件,這些文件逐漸達到我係統中打開的文件限制,從而嘗試打開其他文件導致錯誤。實際的異常是由boost UUID生成器引發的,無法打開文件!