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

本文介绍了一种使用智能指针shared_ptr管理机器人轴运动角度的方法,通过将智能指针放入vector容器实现指针数组,详细解释了resize和reset操作的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

智能指针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.youkuaiyun.com/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!!
``` class Int8EntropyCalibrator : public IInt8EntropyCalibrator2 { public: Int8EntropyCalibrator(const vector&lt;string&gt;&amp; imagefiles, nvinfer1::Dims dims, const Int8Process&amp; preprocess) { Assert(preprocess != nullptr); this-&gt;dims_ = dims; this-&gt;allimgs_ = imagefiles; this-&gt;preprocess_ = preprocess; this-&gt;fromCalibratorData_ = false; files_.resize(dims.d[0]); checkCudaRuntime(cudaStreamCreate(&amp;stream_)); } Int8EntropyCalibrator(const vector&lt;uint8_t&gt;&amp; entropyCalibratorData, nvinfer1::Dims dims, const Int8Process&amp; preprocess) { Assert(preprocess != nullptr); this-&gt;dims_ = dims; this-&gt;entropyCalibratorData_ = entropyCalibratorData; this-&gt;preprocess_ = preprocess; this-&gt;fromCalibratorData_ = true; files_.resize(dims.d[0]); checkCudaRuntime(cudaStreamCreate(&amp;stream_)); } virtual ~Int8EntropyCalibrator(){ checkCudaRuntime(cudaStreamDestroy(stream_)); } int getBatchSize() const noexcept { return dims_.d[0]; } bool next() { int batch_size = dims_.d[0]; if (cursor_ + batch_size &gt; allimgs_.size()) return false; for(int i = 0; i &lt; batch_size; ++i) files_[i] = allimgs_[cursor_++]; if (!tensor_){ tensor_.reset(new Tensor(dims_.nbDims, dims_.d)); tensor_-&gt;set_stream(stream_); tensor_-&gt;set_workspace(make_shared&lt;TRT::MixMemory&gt;()); } preprocess_(cursor_, allimgs_.size(), files_, tensor_); return true; } bool getBatch(void* bindings[], const char* names[], int nbBindings) noexcept { if (!next()) return false; bindings[0] = tensor_-&gt;gpu(); return true; } const vector&lt;uint8_t&gt;&amp; getEntropyCalibratorData() { return entropyCalibratorData_; } const void* readCalibrationCache(size_t&amp; length) noexcept { if (fromCalibratorData_) { length = this-&gt;entropyCalibratorData_.size(); return this-&gt;entropyCalibratorData_.data(); } length = 0; return nullptr; } virtual void writeCalibrationCache(const void* cache, size_t length) noexcept { entropyCalibratorData_.assign((uint8_t*)cache, (uint8_t*)cache + length); } private: Int8Process preprocess_; vector&lt;string&gt; allimgs_; size_t batchCudaSize_ = 0; int cursor_ = 0; nvinfer1::Dims dims_; vector&lt;string&gt; files_; shared_ptr&lt;Tensor&gt; tensor_; vector&lt;uint8_t&gt; entropyCalibratorData_; bool fromCalibratorData_ = false; CUStream stream_ = nullptr; };```解释一下,每一行代码什么意思,
最新发布
03-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值