找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4352|回复: 4

ACE_Message_Block中的数据如何清除

[复制链接]
发表于 2007-12-13 23:42:33 | 显示全部楼层 |阅读模式
我的代码大致是这样的:
首先有一个动态的char数组,存放数据
char *data = new char[n];
然后给通过recv_n把接到的数据给data
然后把data放到ACE_Message_Block中
ACE_Message_Block *mb = new ACE_Message_Block(n,ACE_Message_Block::MB_DATA,0,data);
然后就把mb交给别的线程去处理了. 所以在这里我不能用 delete[] data.把内存释放掉.
等到别的线程把mb消费了以后,调用mb->release().把mb释放掉.但是我发现其中的data不会被释放,于是就出现了内存泄漏. 难道在mb->release之后还有手动的把其中的data delete掉?
ACE对这种情况有没有什么方法来处理.
 楼主| 发表于 2007-12-13 23:42:44 | 显示全部楼层
需要深入理解ACE的ACE_Message_Block,这是一个重要的类,系统的粘合剂,数据传递的载体。
你不需要用char * data = new char[n],只需要让ACE_Message_Block自己管理就可以了。
 楼主| 发表于 2007-12-13 23:43:36 | 显示全部楼层
只是
ACE_Message_Block *mb = new ACE_Message_Block(n,ACE_Message_Block::MB_DATA,0,data);
这种做法不是很好,有画蛇添足之嫌。
ACE_Message_Block,本身可以替代Array,link ,
ACE_Message_Queeu 是Double_link
如果希望用cache,可以看看ACE_CACHED_Alloc在ACE_Message_Block 当中的应用
 楼主| 发表于 2007-12-13 23:43:46 | 显示全部楼层
ACE_Message_Block *mb = new ACE_Message_Block(n,ACE_Message_Block::MB_DATA,0,data);

当然回泄漏拉,ACE_Message_Block只是保存了data指针...直接像你说的

ACE_Message_Block *mb = new ACE_Message_Block(n);

recv_n(mb->wr_ptr(),n);这样用就可以;
 楼主| 发表于 2007-12-13 23:43:53 | 显示全部楼层
ACE_Message_Block (size_t size,
                     ACE_Message_Type type = MB_DATA,
                     ACE_Message_Block *cont = 0,
                     const char *data = 0,
                     ACE_Allocator *allocator_strategy = 0,
                     ACE_Lock *locking_strategy = 0,
                     unsigned long priority = ACE_DEFAULT_MESSAGE_BLOCK_PRIORITY,
                     const ACE_Time_Value &execution_time = ACE_Time_Value::zero,
                     const ACE_Time_Value &deadline_time = ACE_Time_Value::max_time,
                     ACE_Allocator *data_block_allocator = 0,
                     ACE_Allocator *message_block_allocator = 0);

使用这个构造函数,只用第一个参数即可

然后调用release()释放
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 15:35 , Processed in 0.018752 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表