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 ,应该用“=”