ACE Proactor内存泄露2

来源:互联网 发布:java中策略设计模式 编辑:程序博客网 时间:2024/05/24 06:58

进一步深入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,在析构函数中并记得释放

原创粉丝点击