文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>ACE_Message_Block类 使用小结(二)

ACE_Message_Block类 使用小结(二)

时间:2010-10-24  来源:ronat

  1. ACE_Message_Block的构造函数中,如果data为NULL, 则ACE_Message_Block会为其自动分配空间。
    但如data非NULL,则ACE_Message_Block会直接引用data指向的空间, 并不会进行新的空间分配和拷贝。


    所以需要特别注意, 在ACE_Message_Block的实例没有销毁之前,不能释放data指向的空间。

  2. 虽然ACE_Message_Block会根据size的值来更改自己的size(),但wr_ptr不会根据data的长度进行设置,
    造成length()的返回为0。


    需要特别注意, 当构造一个ACE_Message_Block实例后, 随之需要追加数据时,必须设置wr_ptr的值,
    否则原有数据将会被覆写。此时的含义是: ACE_Message_Block代管了data缓冲区,但不负责缓冲区的空间管理(因为也不是由它申请的)。


    默认定义的flag: enum { DONT_DELETE = 01, USER_FLAGS = 0x1000 }

    1) set_flags()、clr_flags()是对ACE_Message_Block中的数据指针(ACE_Data_Block*)进行设置。

    2) set_self_flags(),clr_self_flags()是对ACE_Message_Block本身进行设置。

  3. ACE_Message_Block::copy(const char* buf) 函数将字符串copy到ACE_Message_Block,
    如果内在空间不足, 将会返回-1。


    需要特别注意, copy的数据将包括末尾的0, 也就是copy的数据长度为strlen(buf)+1。而且, 会自动进行wr_ptr()的设置。

  4. ACE_Data_Block中通过duplicate()递增引用计数。 ACE_Data_Block中通过release()递减引用计数,
    当引用计数为0时,先调用ACE_Data_Block析构函数,然后释放ACE_Data_Block自身。

    注意, ACE_Data_Block的构造和析构函数都不知道引用计数的存在。 在构造函数中, 只是设置了初始值1。

  5. ACE_Data_Block一个很奇怪的地方就是ACE_Data_Block::duplicate()的实现, 并没有创建新的拷贝,
    而仅仅是返回了自身(return this)。 这中实现方式带来了很多奇怪的问题。如下面的2,3。

    release()-> release_no_delete()->release_i()->~ACE_Data_Block()

  6. 如果在Stack上构造ACE_Data_Block,那么不能使用release()函数, 因为release()函数会试图删除this;

     

    如果在stack上构造ACE_Data_Block, 那么不能使用duplicate()函数, 因为duplicate()返回的是this指针,
    栈中的ACE_Data_Block析构后会导致问题;

    如果在heap上构造ACE_Data_Block,那么尽量使用release()来替代delete, 如果存在因为析构并不处理
    reference count, delete时不考虑其它会导致指针悬空;

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载