您的位置:首页 > 编程语言 > C语言/C++

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

2012-10-30 09:12 162 查看
说明: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时问题较严重.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: