|
发表于 2010-7-26 11:58:04
|
显示全部楼层
我检查了一下系统的运行流程,认为找到了原因:- int
- ACE_Asynch_Read_Stream::open (ACE_Handler &handler,
- ACE_HANDLE handle,
- const void *completion_key,
- ACE_Proactor *proactor)
- {
- // Get a proactor for/from the user.
- proactor = this->get_proactor (proactor, handler);
- // Now let us get the implementation initialized.
- if ((this->implementation_ = proactor->create_asynch_read_stream ()) == 0)
- return -1;
复制代码 //这里,每次都会创建一个新的异步处理器- ACE_Asynch_Read_Stream_Impl *
- ACE_WIN32_Proactor::create_asynch_read_stream (void)
- {
- ACE_Asynch_Read_Stream_Impl *implementation = 0;
- ACE_NEW_RETURN (implementation,
- ACE_WIN32_Asynch_Read_Stream (this),
- 0);
- return implementation;
- }
复制代码 freeeyes的工程,为了加快速度,把handler转变成了对象池,但ACE的代码显然没考虑过这样的应用。所以每次在handler对象open的时候,无论是否已经存在异步处理器,都会创建一个新的异步处理器,这导致了内存泄漏。而把m_reader/m_writer变成指针后,则会在delete的时候,自动的清除对应的异步处理器,就没有问题了。
改进方法嘛,修改ACE,做一下存在的判断。或者放弃这个模式。 |
|