ACE Proactor內存泄露2

進一步深入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,在析構函數中並記得釋放

發佈了15 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章