peakzhang 发表于 2007-12-13 23:42:33

ACE_Message_Block中的数据如何清除

我的代码大致是这样的:
首先有一个动态的char数组,存放数据
char *data = new char;
然后给通过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对这种情况有没有什么方法来处理.

peakzhang 发表于 2007-12-13 23:42:44

需要深入理解ACE的ACE_Message_Block,这是一个重要的类,系统的粘合剂,数据传递的载体。
你不需要用char * data = new char,只需要让ACE_Message_Block自己管理就可以了。

peakzhang 发表于 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 当中的应用

peakzhang 发表于 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);这样用就可以;

peakzhang 发表于 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()释放
页: [1]
查看完整版本: ACE_Message_Block中的数据如何清除