我对C++核心类库TAttributeSet在稳定性和效率优化上提出的comment

说明:TAttributeSet是coremail邮件系统中,一个可以用来以类似key-value形式来管理存储数据的内存数据结构的C++类(有些类似c++ rtmp server 里面的Variant类)

以下是我以前在coremail工作期间对其提出的优化和稳定性方面的建议:

1.   -fnew-abi选项支持空基类优化. 
2.   tnetbuffer.h   m_pResolver->GetSize(strValue)  可以改进. 
3.   TRefAttributeSet类不能Put入键值相同的两个TAttributeSet或者TRefAttributeSet对象. 
4.   TVarArray的析构函数最好加上if(m_pArray!=NULL)和if(m_pUBounds!=NULL)的条件. 
5.   
tattribute.cpp 
TAttribute::TAttribute(const IString &strAttrID, const TVarObject &varObj) 
XNew(pVar, TVarObject(varObj)); 
m_Values.Append(pVar);  //失败时只会返回NULL, 不会throw出Exception 
     有可能出现XNew(pVar, TVarObject(varObj));成功 但然后m_Values.Append(pVar)失败的情况, 
这样pVar的内存无法释放,  虽然可能性不是很大, 但毕竟是有可能出现的. 
void TAttribute::Clone(const TAttribute &right)里有同一处. 

tattrliststrategy.cpp 
TAttribute &TAttrListStrategy::Put(const IString &strAttrID, TVarObject *varObj, bool bAllowDup) 
53行:  XNew(pAttribute, TAttribute(strAttrID, varObj)); 
attr = m_Attributes.Append(pAttribute); 


tattrarraystrategy.cpp 
TAttribute & TAttrArrayStrategy::Put(const IString &strAttrID, TVarObject *varObj, bool bAllowDup) 
50行:  XNew(pAttribute, TAttribute(strAttrID, varObj)); 
m_Attributes.push_back(pAttribute); 
应当改为:  
XNew(pAttribute, TAttribute(strAttrID, varObj)); 
try{ 
                m_Attributes.push_back(pAttribute); 
                }catch() 
                  { 
                    delete pAttribute; 
                    throw ... 
                  } 
tattrhashstrategy.cpp 
TAttribute &TAttrHashStrategy::Put(const IString &strAttrID, TVarObject *varObj, bool bAllowDup) 
58行:  XNew(pAttr, TAttribute(strAttrID, varObj)); 
m_Container->Store(strAttrID, pAttr); 
应当改为: 
XNew(pAttr, TAttribute(strAttrID, varObj)); 
if( m_Container->Store(strAttrID, pAttr)==false ) 

delete pAttr; 
throw ... 


thashmap.h 
193行:     pNode = new THashNode<TKey, TNode>( Key, Object ); 
        之后最好判断pNode!=NULL 

tnetbuffer.cpp 
86行: void *tmp = new char[nLen]; 
319行: 
void *pData = new char[nNewSize]; 
                后面最好加pData!=NULL的判断. 



6.   TAttributeSet  put的时侯除非使用TAttribute &Put(const IString &strAttrID, TVarObject *varObj)接口, 
否则一定都要new两次TVarObject对象,  clone操作造成了内存复制开销,  在put比较大的string或者另一个 
attributeset时问题较严重.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值