容器vector的resize操作 & 智能指针shared_ptr的reset操作

智能指针shared_ptr常使用的一种场景是:智能指针数组,即将多个指针放在同一个容器(比如vector)里。下面代码是将指向队列的智能指针放在容器vector中:

typedef std::deque<double> AglSeq; 
typedef boost::shared_ptr<AglSeq> AxisSeqPtr; 
typedef std::vector<AxisSeqPtr> N_AxisSeqPtr;
typedef N_AxisSeqPtr::size_type N_AxisSeqPtrIdx;

机器人每个轴的运动角度用一个智能指针来管理,每个智能指针指向一个队列,用来盛放机器人运动轨迹算法计算出的位置角度;机器人有多个轴,所以用一个容器vector来容纳管理轴的所有指针,从而组成了一个指针数组类型N_AxisSeqPtr。

N_AxisSeqPtr nAglSeqPtr;
//初始化
nAglSeqPtr.resize(m);                       
for (N_AxisSeqPtrIdx idx=0; idx!=m; ++idx)
{
    nAglSeqPtr[idx].reset(new AglSeq());  
}
//使用
for(unsigned i=0; i<pointNum; ++i)
{
    for (N_AxisSeqPtrIdx idx=0; idx!=m; ++idx)
    {
        nAglSeqPtr[idx]->push_back(rad2deg(posACS(i))); 
        nAglSeqPtr[idx]->pop_front(); 
        X = nAglSeqPtr[idx]->at(pointNum);
        X = nAglSeqPtr[idx]->back();
        X = nAglSeqPtr[idx]->front();
        nAglSeqPtr[idx]->clear();
        nAglSeqPtr[idx]->insert(iterator_p, args);
        nAglSeqPtr[idx]->erase(iterator_p);

    }
}
......
//重置改变
nAglSeqPtr.resize(n);                           //不同类型机器人有不同轴数,故需要重置数组大小
for (N_AxisSeqPtrIdx idx=0; idx!=n; ++idx)
{
    nAglSeqPtr[idx].reset(new AglSeq());        //重置智能指针的所指对象
}

提出的问题
1. 指针数组resize操作之后,之前的指针所指向的对象还在吗? 还可以继续使用吗?
:参考博客http://blog.csdn.net/cjfeii/article/details/9247569
vector的成员函数resize分析
resize会调用构造函数来构造一个容器存放类型的临时变量,这里指的是智能指针shared_ptr类临时对象,不妨设为tmpA。
如果__new_size > size(),就进行insert操作;
如果__new_size < size(),就进行erase操作,直接调用相应的析构函数
最后,调用tmpA的析构函数。
2. 智能指针的reset操作是怎样的?

p.reset(new AglSeq())
指针与指向原来对象对应的引用计数减1,若引用计数减为0则释放该对象内存;
指针与指向新对象对应的引用计数加1;

p.reset()
指针与指向原来对象对应的引用计数减1,若引用计数减为0则释放该对象内存;

if ( !p.unique() )                              //改变前判断是否对象的唯一使用者,若不是则拷贝一份用来修改
{
    p.reset( new string( *p ) );
}
*p += newValue;
if ( p.use_count() == 0 ){...}                 //一般用于调试,是比较耗时的操作time-consuming!!
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值