ACE_NEW_RETURN的意思

本文解析了ACE库中ACE_NEW_RETURN宏的三种定义方式及其用途,强调了内存管理和使用auto_ptr的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看到好多ACE程序都使用了ACE_NEW_RETURN,找到ACE_NEW_RETURN的出处,有三个定义,都在OS_Memory.h中定义,可能是用于适应不同的平台而作的吧。下面的这个是最容易看懂的,用了try-catch语句。

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

ACE_NEW_RETURN的定义是:
ACE_NEW_RETURN(POINTER,CONSTRUCTOR,RET_VAL)
ACE_NEW_RETURN对应翻译是:
try
{
      POINTER=new CONSTRUCTOR;
}
catch(ACE_bad_alloc)
{
       errno=ENOMEM;
       POINTER=0;
       return RET_VAL;
}
意思就是用new动态生成一个参数2类型的空间,并将空间的首地址副给第一个参数。如果有错误产生则将第一个参数的值设为空,并返回值RET_VAL。不过不知道为什么Doung为什么喜欢在副值之前用do-while语句,莫非这样做有什么好处?

为什么要这么做呢,我想到原因就是省代码,省了相同结构的代码,不过也带来了危险性,你隐藏了new,这是非常危险的事情,甚至是不让这样做的事情,不知道Douglas C.Schmidt博士又有什么见解。

所以,在你使用ACE_NEW_RETURN、ACE_NEW和ACE_NEW_NORETURN时候,请你注意它们已经new出来了空间,你需要自己去delete掉,否则会内存泄漏了。
不过有好的方法,用auto_ptr,ACE有自己的<ace/Auto_Ptr.h>,我现在还不大清楚它与std::auto_ptr关系,但是看了下<ace/Auto_Ptr.h>源码,是和std::auto_ptr有关系的。
用auto_ptr来帮助你吧,在auto_ptr牺牲的时候它会帮你delete可能会泄漏的内存:
    CTest* test;
    ACE_NEW_RETURN(test, CTest, -1);
    auto_ptr<CTest> p(test );



另两个定义是
#    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_RETURN(POINTER,CONSTRUCTOR,RET_VAL) /
   do { POINTER = new CONSTRUCTOR; /
     if (POINTER == 0) { errno = ENOMEM; return RET_VAL; } /
   } while (0)


本文来自优快云博客,转载请标明出处: http://blog.youkuaiyun.com/level1979/archive/2006/04/06/652463.aspx

ACE_WFMO_Reactor 是 ACE(Adaptive Communication Environment)框架中的一个反应器实现,专门用于 Windows 平台。它基于 WaitForMultipleObjects 函数,提供了一种高效的事件驱动机制来处理多线程环境中的并发事件。 在多线程环境中,ACE_WFMO_Reactor 可以与多个线程协同工作,从而提高应用程序的并发处理能力。以下是一些关键点: 1. **事件处理**:ACE_WFMO_Reactor 可以注册多个事件处理器(Event Handlers),每个处理器可以处理不同类型的事件,如读、写、异常等。 2. **线程安全**:ACE_WFMO_Reactor 提供了线程安全的接口,确保在多线程环境下对反应器的操作不会导致数据竞争或死锁。 3. **并发处理**:通过将事件处理器分配给不同的线程,可以实现并发处理多个事件,提高系统的响应速度和吞吐量。 4. **同步机制**:ACE 提供了多种同步机制,如互斥锁(Mutex)、条件变量(Condition Variable)等,可以与 ACE_WFMO_Reactor 结合使用,以实现更复杂的并发控制。 5. **事件驱动**:ACE_WFMO_Reactor 采用事件驱动的方式,应用程序只需注册事件处理器并等待事件发生,而不需要显式地轮询或管理线程的调度。 以下是一个简单的示例,展示了如何在多线程环境中使用 ACE_WFMO_Reactor: ```cpp #include <ace/Reactor.h> #include <ace/Task.h> #include <ace/WFMO_Reactor.h> #include <ace/Thread_Manager.h> class My_Handler : public ACE_Event_Handler { public: virtual int handle_input(ACE_HANDLE handle) { // 处理输入事件 return 0; } virtual ACE_HANDLE get_handle() const { return ACE_STDIN; } }; class My_Task : public ACE_Task_Base { public: My_Task(ACE_Reactor *reactor) : reactor_(reactor) {} virtual int svc() { reactor_->owner(ACE_Thread::self()); reactor_->run_reactor_event_loop(); return 0; } private: ACE_Reactor *reactor_; }; int main() { ACE_WFMO_Reactor reactor; My_Handler handler; My_Task task(&reactor); task.activate(THR_NEW_LWP | THR_JOINABLE, 4); task.wait(); return 0; } ``` 在这个示例中,`My_Handler` 是事件处理器,`My_Task` 是处理事件的线程任务。`ACE_WFMO_Reactor` 被传递给多个线程任务,以实现并发处理事件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值