ACE大牛们过来看看

Gengoo 2009-03-24 05:52:58

MQ.h文件:
#ifndef MQ_H_
#define MQ_H_

#include "ace/Message_Queue.h"
#include "ace/Task.h"
#include "ace/INET_Addr.h"
#include "ace/SOCK_Stream.h"
#include "ace/SOCK_Connector.h"
#include "ace/Log_Msg.h"
#include "ace/Os.h"
#include "ace/Thread_Mutex.h"
#include "ace/Mutex.h"
#include "ace/Lock.h"
#include "ace/Addr.cpp"
#include "ace/Time_Value.cpp"
#include "ace/String_Base_Const.cpp"
#include "ace/OS_String.cpp"

class QTest
{
public:
QTest(int num_msgs);

int enq_msgs();

int deq_msgs();

private:

//定义消息队列
ACE_Message_Queue <ACE_NULL_SYNCH> *mq_;

//消息队列个数
int no_msgs_;
};

#endif


MQ.cpp文件:
#include "MQ.h"

QTest::QTest(int num_msgs) : no_msgs_(num_msgs)
{
ACE_TRACE("QTest::QTest");

//第一次创建消息队列定义大小
if (! (this->mq_ = (new ACE_Message_Queue <ACE_NULL_SYNCH>() )))
{
ACE_DEBUG ((LM_ERROR, "Error in message queue initialization\n"));
}
}

int QTest::enq_msgs()
{
ACE_TRACE ("QTest::enq_msgs");

for (int i=0; i<no_msgs_; i++)
{
//为每个消息创建一个消息块
ACE_Message_Block *mb;

//初始化消息块大小
ACE_NEW_RETURN (mb, ACE_Message_Block (ACE_OS::strlen("This is message 1\n")), -1);

//把数据插入到消息块
ACE_OS::sprintf (mb->wr_ptr(), "This is message %d\n", i);

//移动消息块的指针
mb->wr_ptr (ACE_OS::strlen("This is message 1\n"));

//把消息块入队
if (this->mq_->enqueue_prio(mb) == -1)
{
ACE_DEBUG ((LM_ERROR, "\nCould not enqueue on to mq!!\n"));

return -1;
}

ACE_DEBUG ((LM_INFO, "EQ'd data: %s\n", mb->rd_ptr() ));
}

//现在打印所有的消息
this->deq_msgs();

return 0;
}

int QTest::deq_msgs()
{
ACE_TRACE ("QTest::dequeue_all");

ACE_DEBUG ((LM_INFO, "No. of Messages on Q: %d Bytes on Q: %d\n",
mq_->message_count(), mq_->message_bytes()));

ACE_Message_Block *mb;

for (int i=0; i<no_msgs_; ++i)
{
mq_->dequeue_head(mb);

ACE_DEBUG ((LM_INFO, "DQ'd data %s\n", mb->rd_ptr() ));

// mb->rd_ptr(ACE_OS::strlen(mb->rd_ptr()) + 1);

mb->release();//每次程序运行到这里后就崩溃了。如果把此句注销, 则程序能正确输出结果
}

return 0;
}

int main(int argc, char *argv[])
{
if (argc < 2)
{
ACE_ERROR_RETURN ((LM_ERROR, "Usage %s num_msgs", argv[0]), -1);
}

QTest test (ACE_OS::atoi(argv[1]));

if (test.enq_msgs() == -1)
{
ACE_ERROR_RETURN ((LM_ERROR, "Program failure\n"), -1);
}

return 0;
}

很奇怪, 我在往消息队列里面插入5条数据后, 然后从消息队列里面取出并打印。但每次执行到mb->release()时就崩溃了,
查看内存, mb的内存信息是0x00982c30,同时存在内容。
EQ'd data: This is message 0

EQ'd data: This is message 1

EQ'd data: This is message 2

EQ'd data: This is message 3

EQ'd data: This is message 4

No. of Messages on Q: 5 Bytes on Q: 90
DQ'd data This is message 0

但是如果把mb->release()注释, 则程序能正常输出。
EQ'd data: This is message 0

EQ'd data: This is message 1

EQ'd data: This is message 2

EQ'd data: This is message 3

EQ'd data: This is message 4

No. of Messages on Q: 5 Bytes on Q: 90
DQ'd data This is message 0

DQ'd data This is message 1

DQ'd data This is message 2

DQ'd data This is message 3

DQ'd data This is message 4

Press any key to continue

难道这里不能用mb->release()释放掉这个消息块的内存, 如果不释放, 那岂不造成内存泄露。

请大牛们帮我看看这应该怎么处理



...全文
146 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
品茶 2009-03-25
  • 打赏
  • 举报
回复
Mark
Study
Paradin 2009-03-25
  • 打赏
  • 举报
回复
忘了。帮顶。
Gengoo 2009-03-25
  • 打赏
  • 举报
回复
靠, 居然没人给我回复, 还得自己解决. 又不能给自己分

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧