本文参考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\n",b2->rd_ptr());     --->hello word
ACE_OS::printf("%s\n",buffer);               --->hello word
b2->release();
//ACE_OS::printf("%s",b2->rd_ptr());     --->has excaption
ACE_OS::printf("%s\n",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\n",b3->rd_ptr());  --->hello word
ACE_OS::printf("%s\n",b4->rd_ptr());  --->hello word

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

ACE_OS::printf("reference_count %i\n",b4->reference_count());  ---> 1
ACE_OS::printf("%s\n",b4->rd_ptr());  --->hello word
b4->release();
ACE_OS::printf("%s\n",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\n",b3->rd_ptr());  --->hello word
ACE_OS::printf("%s\n",b4->rd_ptr());  --->乱码

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

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

5.ACE_Message_Block 中copy的用法

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

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

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

注意:由于c++是以'\0'作为字符串结束标志的,对于上面的例子,底层数据块中保存的是"hello\0123\0",而用ACE_OS::printf("%s\n",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\n",b9->cont()->rd_ptr());
ACE_OS::printf("b10 %s\n",b10->rd_ptr());

ACE_Message_Block 学习的更多相关文章

  1. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  2. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  3. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  4. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. Unity3d学习 制作地形

    这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...

  7. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  8. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  9. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

随机推荐

  1. jsRender模板引擎

    jsRender模板引擎 上一篇最后提到了模板,并尝试自己编写一个最简单版本:有些朋友可能用过 jqtmpl,这是一个基于jquery的模板引擎,不过它已经不再更新了,而且据说渲染速度比较慢.这里介绍 ...

  2. [Django1.6]The MEDIA_ROOT and STATIC_ROOT settings must different 解决

    该项目有一个图片上传功能,为了把上传路径很简单,写在同一个静态文件路径,于wi7执行机器上没问题,今centos我们报道了机上,如下面的错误: django.core.exceptions.Impro ...

  3. Cocos2d-x 脚本语言Lua使用

    Cocos2d-x 脚本语言Lua使用 前面几篇博客已经把Lua的相关基础知识介绍了.本篇博客就来介绍一下,怎样在Cocos2d-x项目中使用Lua这门脚本语言进行开发.因为笔者使用的时Mac系统.所 ...

  4. .net程序调用检测和性能分析工具——DotTrace

    DotTrace可以对.net程序进行性能监测,对正在运行的程序和网站监控,主要界面如下: 需要将该工具安装在程序运行的服务器上. 主要用到这个视图,显示了每个方法的时间,下面是反编译出来的代码. P ...

  5. C++ Regsvr32订购具体解释

    一.Regsvr32命令 Regsvr 32命令是Windows在控制文件(如延长DLL.OCX.CPL文件)注册和反注册工具. 命令格公式:Regsvr32 [/s] [/n] [/i[:cmdli ...

  6. 如何用Excel直接查询Oracle中的数据(转)

    将Oracle中查询的数据保存为Excel文件,通常使用的是PL/SQL Developer. 其实,Excel可直接写SQL语句查询Oracle中数据,在这里,用到ODBC驱动.详细步骤如下: 一. ...

  7. Java 反射 想

    所谓反射.是指在执行时状态中,获取类中的属性和方法.以及调用当中的方法的一种机制. 这样的机制的作用在于获取执行时才知道的类(Class)及当中的属性(Field).方法(Method)以及调用当中的 ...

  8. DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表

    原文:DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的, ...

  9. Blocks and Variables

    Blocks and Variables https://developer.apple.com/library/ios/documentation/cocoa/conceptual/Blocks/A ...

  10. Python的print中国输出对齐问题

    问题叙述性说明: 在使用Python内置函数print当输出英语,应用格输出类型可以对齐很好: s1 = 'I am a long sentence.' s2 = 'I\'m short.' prin ...