zoukankan      html  css  js  c++  java
  • ACE_Message_Block 学习

    本文参考http://www.cnblogs.com/TianFang/archive/2006/12/30/607960.html

    1. ACE_Message_Block 的length() 返回的是写指针和读指针之间的字符数量。如

    lb->wr_ptr(10);

    lb->rd_ptr(20);

    lb->length();   // -10

    2. ACE_Message_Block 下面的用法会和数组共用同一个内存块。释放时不释放数组。

    ACE_TCHAR buffer[100];
    ACE_Message_Block *b2 = new ACE_Message_Block(buffer,ACE_OS::strlen(buffer));
    ACE_OS::sprintf(b2->wr_ptr(),"%s","hello word");
    ACE_OS::printf("%s ",b2->rd_ptr());     --->hello word
    ACE_OS::printf("%s ",buffer);               --->hello word
    b2->release();
    //ACE_OS::printf("%s",b2->rd_ptr());     --->has excaption
    ACE_OS::printf("%s ",buffer);               --->hello word

    3. ACE_Message_Block 下面的用法会共用同一个内存块。通过引用计数的方式释放数据。

    ACE_Message_Block *b3 = new ACE_Message_Block(30);
    ACE_Message_Block *b4 = b3->duplicate();
    ACE_OS::sprintf(b3->wr_ptr(),"%s","hello word");
    ACE_OS::printf("%s ",b3->rd_ptr());  --->hello word
    ACE_OS::printf("%s ",b4->rd_ptr());  --->hello word

    ACE_OS::printf("reference_count %i ",b4->reference_count());  ---> 2
    b3->release();

    ACE_OS::printf("reference_count %i ",b4->reference_count());  ---> 1
    ACE_OS::printf("%s ",b4->rd_ptr());  --->hello word
    b4->release();
    ACE_OS::printf("%s ",b4->rd_ptr());  --->has excaption

    4. ACE_Message_Block下面的用法会进行深拷贝。

    ACE_Message_Block *b3 = new ACE_Message_Block(30);
    ACE_Message_Block *b4 = b3->clone();
    ACE_OS::sprintf(b3->wr_ptr(),"%s","hello word");
    ACE_OS::printf("%s ",b3->rd_ptr());  --->hello word
    ACE_OS::printf("%s ",b4->rd_ptr());  --->乱码

    ACE_OS::printf("reference_count %i ",b4->reference_count());  --->1
    b3->release();

    ACE_OS::printf("reference_count %i ",b4->reference_count());  --->1
    ACE_OS::printf("%s ",b4->rd_ptr());  --->乱码
    b4->release();
    ACE_OS::printf("%s ",b4->rd_ptr());  --->has excaption

    5.ACE_Message_Block 中copy的用法

    一般的数据的拷贝可以通过函数来实现数据的拷贝,copy()还会保证wr_ptr()的更新,使其指向缓冲区的新末尾处。

    下面的例子演示了copy()函数的用法。

        mb->copy("hello");
        mb->copy("123",4);

    注意:由于c++是以''作为字符串结束标志的,对于上面的例子,底层数据块中保存的是"hello123",而用ACE_OS::printf("%s ",mb->rd_ptr ());打印出来的结果是"hello",使用copy函数进行字符串连接的时候需要注意。

    6.ACE_Message_Block 中可以将多个消息块连接起来

    ACE_Message_Block *b9 = new ACE_Message_Block(30);
    ACE_OS::sprintf(b9->wr_ptr(),"%s","hello");
    ACE_Message_Block *b10 = new ACE_Message_Block(30);
    ACE_OS::sprintf(b10->wr_ptr(),"%s","word");

    b9->cont(b10);

    ACE_OS::printf("b10 %s ",b9->cont()->rd_ptr());
    ACE_OS::printf("b10 %s ",b10->rd_ptr());

  • 相关阅读:
    团队作业第三次——项目需求分析
    快乐就队——第八次站立式会议(05-02)
    快乐就队——第七次站立式会议(04-30)
    快乐就队——第六次站立式会议(04-29)
    快乐就队——第五次站立式会议(04-28)
    快乐就队——第四次站立式会议(04-27)
    快乐就队——第三次站立式会议(04-26)
    快乐就队——第二次站立式会议(04-25)
    快乐就队——第一次站立式会议(04-24)
    快乐就队——项目系统设计与数据库设计
  • 原文地址:https://www.cnblogs.com/sunleinote/p/3687601.html
Copyright © 2011-2022 走看看