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

阅读更多
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( 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时问题较严重.

你可能感兴趣的:(C,C++,C#)