進一步深入ACE的源代碼發現,所謂的內存泄露的根本原因是在ACE_Asynch_Acceptor<HANDLER>::open函數中,在open函數中,有如下代碼
for (int i = 0; i < number_of_initial_accepts; i++)
// Initiate
accepts.
if (this->accept (bytes_to_read) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
"%p/n",
"ACE_Asynch_Acceptor::accept"),
-1);
具體的accept的實現如下,
ACE_TRACE ("ACE_Asynch_Acceptor<>::accept");
ACE_Message_Block *message_block = 0;
size_t space_needed =
bytes_to_read + 2 * this->address_size ();
// Create a new message block big enough for the addresses and data
ACE_NEW_RETURN (message_block,
ACE_Message_Block
(space_needed),
-1);
// Initiate asynchronous accepts
if (this->asynch_accept_.accept
(*message_block,
bytes_to_read,
ACE_INVALID_HANDLE,
act) == -1)
{
// Cleanup on error
message_block->release ();
return -1;
}
return 0;
也就是說,在open的過程中,創建了number_of_initial_accepts個message_block,大小爲number_of_initial_accepts,
這些message_block是動態分配的,如果接受了一個新的連接,將把現在的message_block->release,並再分配一個bytes_to_read大小的message_block,因此始終存在一個或若干個動態分配的message_block,問題是在程序結束的時候並沒有將這些message_block進行釋放,因此造成功了內存泄露的情況,但這是一次性的,程序運行過程中不會出現新的內存泄露,看來要解決這個問題,1,可以分配一定數量一定大小的message_block,循環使用,在析構函數中並記得釋放,2,簡單一點可以增加個變量,記錄這些動態分配的message_block,在析構函數中並記得釋放