ACE_TAO 013 ACE_NEW_RETURN

Posted islinyoubiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACE_TAO 013 ACE_NEW_RETURN相关的知识,希望对你有一定的参考价值。

在文章

ACE_TAO 008 Reactor基本原理与说明

中使用了ACE_NEW_RETURN来新建对象类,还有ACE_NEW和ACE_NEW_NORETURN等等,定义都在OS_Memory.h中,代码如下:

#  if defined (ACE_HAS_NEW_NOTHROW)
#    define ACE_NEW_RETURN(POINTER,CONSTRUCTOR,RET_VAL) \\
   do { POINTER = new (ACE_nothrow) CONSTRUCTOR; \\
     if (POINTER == 0) { errno = ENOMEM; return RET_VAL; } \\
   } while (0)
#    define ACE_NEW(POINTER,CONSTRUCTOR) \\
   do { POINTER = new(ACE_nothrow) CONSTRUCTOR; \\
     if (POINTER == 0) { errno = ENOMEM; return; } \\
   } while (0)
#    define ACE_NEW_NORETURN(POINTER,CONSTRUCTOR) \\
   do { POINTER = new(ACE_nothrow) CONSTRUCTOR; \\
     if (POINTER == 0) { errno = ENOMEM; } \\
   } while (0)

#  else

#    define ACE_NEW_RETURN(POINTER,CONSTRUCTOR,RET_VAL) \\
   do { try { POINTER = new CONSTRUCTOR; } \\
     catch (ACE_bad_alloc) { ACE_del_bad_alloc errno = ENOMEM; POINTER = 0; return RET_VAL; } \\
   } while (0)

这个宏作用就是new一个新的类指针。因为是新指针,要delete保存内存不泄漏。

所以在close时有如下代码:

ACE_INT32 Handle_data::handle_close(ACE_HANDLE, ACE_Reactor_Mask mask)
{
    get_peer().close(); //关闭Socket
    ACE_DEBUG((LM_DEBUG, "Handle data close.\\n"));
    delete this;//释放事件处理器对象
    return 0;
}

用delete this把对象释放。

网上也有指导用auto_ptr智能指针的

https://blog.csdn.net/andywangcn/article/details/6270245

ptrClass *pClass;
ACE_NEW_RETURN(pClass, Class, -1);
auto_ptr<Class> auto_ptrClass(pClass);

这样也可以自动释放pClass指针了。

多谢,亲爱的美美。

以上是关于ACE_TAO 013 ACE_NEW_RETURN的主要内容,如果未能解决你的问题,请参考以下文章

ACE_TAO

ACE_TAO 007

ACE_TAO 005

ACE_TAO 006

ACE_TAO 003

ACE_TAO 017 ACE_wrappersexamplesReactor