ACE_Message_Block类 使用小结(二)
时间:2010-10-24 来源:ronat
-
ACE_Message_Block的构造函数中,如果data为NULL, 则ACE_Message_Block会为其自动分配空间。
但如data非NULL,则ACE_Message_Block会直接引用data指向的空间, 并不会进行新的空间分配和拷贝。
所以需要特别注意, 在ACE_Message_Block的实例没有销毁之前,不能释放data指向的空间。
虽然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本身进行设置。
ACE_Message_Block::copy(const char* buf) 函数将字符串copy到ACE_Message_Block,
如果内在空间不足, 将会返回-1。
需要特别注意, copy的数据将包括末尾的0, 也就是copy的数据长度为strlen(buf)+1。而且, 会自动进行wr_ptr()的设置。
ACE_Data_Block中通过duplicate()递增引用计数。 ACE_Data_Block中通过release()递减引用计数,
当引用计数为0时,先调用ACE_Data_Block析构函数,然后释放ACE_Data_Block自身。
注意, ACE_Data_Block的构造和析构函数都不知道引用计数的存在。 在构造函数中, 只是设置了初始值1。
ACE_Data_Block一个很奇怪的地方就是ACE_Data_Block::duplicate()的实现, 并没有创建新的拷贝,
而仅仅是返回了自身(return this)。 这中实现方式带来了很多奇怪的问题。如下面的2,3。
release()-> release_no_delete()->release_i()->~ACE_Data_Block()
如果在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时不考虑其它会导致指针悬空;相关阅读 更多 +