看到好多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.csdn.net/level1979/archive/2006/04/06/652463.aspx
