我对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<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时问题较严重.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值