ACE服务端编程3:ACE跨平台之分配堆内存

本文深入探讨ACE服务端编程系列的第三篇,重点解析ACE如何通过ACE_NEW_RETURN,ACE_NEW等宏消除不同编译器在堆内存分配上的不一致性。介绍了内存分配失败的检查方法及ACE宏的应用,同时讨论了现代编译器对异常机制的支持,并提供了示例代码。最后,文章还提到了检查内存分配失败时系统可能存在的严重问题,以及是否使用ACE宏的选择。

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

ACE服务端编程系列的第三篇,探究ACE解决不同编译器之间分配堆内存的差异。

在ACE的官方示例中会看到大量的ACE_NEW_RETURN,ACE_NEW这样的宏,这是ACE为了消除不同编译器编译的代码在堆上分配内存失败的行为差异。

具体来说:

使用 malloc/calloc 等分配内存的函数时,一定要检查其返回值是否为“空指针”(亦即检查分配内存的操作是否成功),这是良好的C++编程习惯,也是编写可靠服务端程序所必需的。

如果使用 new 分配内存失败时,C++标准的规定是抛出异常,如果想检查内存分配是否成功,应该捕捉异常。而一些老的编译器里,new 如果分配内存失败,是不抛出异常的,因为那时 C++ 还没加入异常机制和制定标准。

为了消除这种不一致性,ACE提供了三个宏,在内存分配失败时采用了malloc的方式,设置为空指针:

ACE_NEW(p,c):使用构造器c分配内存,在失败时p设置为0,并执行return;

ACE_NEW_RETURN(p,c,r):使用构造器c分配内存,在失败时p设置为0,并执行return r;

ACE_NEW_NORETURN(p,c):使用构造器c分配内存,在失败时p设置为0,并执行下一条语句;

示例代码:

ACE_NEW_RETURN (http_url,
                  HTTP_URL (**url_addr_ptr),
                  0);

ACE_NEW_RETURN (mb, ACE_Message_Block (sizeof(Message)), -1);

char *c;
ACE_NEW_NORETURN(c,char [64]);
if(c == 0){
    exit(1)
}

更深一层,如果发生堆内存分配失败,实际上更应该考虑系统中是否存在严重的内存泄露,而且基本的现代C++编译器都遵循了标准抛出异常,对于是否使用ACE的这三个宏大家可以自己选择。

延伸阅读:

漫谈C++内存分配失败 

转载于:https://www.cnblogs.com/ym123/p/4521177.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值