智能指针之使用空指针错误

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

在一个函数中有如下处理:

lRet = pSlave->calcInverseKin_RPY(posr, pLast, posACS);
    if (lRet != RBTINTERF_NO_ERROR)
    {
        logMsg((char*)"Error:pSlave->calcInverseKin_RPY(posr, pLast, posACS)\n", 0,0,0,0,0,0);
        if (pGrpTcp_Base)
            pGrpTcp_Base->clear();
            for (N_AxisSeqPtrIdx idx=0; idx != nS+nM; ++idx)
            {
                nAglSeqPtr[idx].reset(); //不能在这里reset()指针数组里的智能指针,否则会造成        wrongStop()中再次使用该指针数组中的指针时空指针错误
            }
        return lRet;
    }

在出错后的处理函数wrongStop()中有以下代码时,就造成了使用指针中的经典错误:使用空指针

wrongStop()
{
    currentSize = nAglSeqPtr[0]->size() ;//在该函数中,使用者不知道nAglSeqPtr[0]里的指针在其他地方被重置变成空指针了,还以为指向之前的队列呢!!
}

经验总结
在使用指针时,一定要建立起安全意识:我将要使用的指针是否为空指针。使用空指针是经典错误,要有判断是否为空指针的意识。此外还要有防止内存泄漏,野指针,重复释放内存,越界等经典错误。在工作中出现一次这种错误,留下惨痛教训,加深印象和理解,避免以后再犯类似错误。

std::shared_ptr<int> p(new int());  // 1
p.reset(new int());                 // 2

1中动态分配了两份内存:一份为被管理对象int(); 一份为管理对象shared_ptr
2中动态分配了一份内存,可能还释放了一份内存

p = std::make_shared<int>(5); // assign to a newly created shared pointer
p.reset(new int(5)); // take control of a newly created pointer

p = new int(5); // 不能将原始指针(raw point)通过“=”赋给shared_ptr;应该用reset
p.reset(std::make_shared<int>(5).get()); // 

若要将raw point赋给shared_ptr,应该用reset(new xxxx);
若要将shared_ptr赋给另一个shared_ptr ,应该用“=”

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值