C++ boost::共享的ptr被删除了

C++ boost::共享的ptr被删除了,c++,boost,shared-ptr,C++,Boost,Shared Ptr,我有一个使用boost::shared_ptr的简单类结构 它看起来像- 积分等级: boost::shared_ptr<PointPrism> getPrismFromDirection(const Point3& direction) const { return boost::shared_ptr<PointPrism>(new PointPrism(_position, direction)); } boost::shared_ptr<Po

我有一个使用boost::shared_ptr的简单类结构

它看起来像-

积分等级:

boost::shared_ptr<PointPrism> getPrismFromDirection(const Point3& direction) const
{
    return boost::shared_ptr<PointPrism>(new PointPrism(_position, direction));
}

boost::shared_ptr<PointPrism> getPrismFromAimingPoint(const Point3& aimingPoint)
{
    boost::shared_ptr<PointPrism> prism = getPrismFromDirection((aimingPoint - _position).normalized());
    prism->setAimingPoint(aimingPoint);
    return prism;
}    
boost::共享\ptr getPrismFromDirection(常量点3和方向)常量
{
返回升压::共享的(新的点棱镜(_位置,方向));
}
boost::shared_ptr GetPrismFromingPoint(常量点3和目标点)
{
boost::shared_ptr prism=getPrismFromDirection((瞄准点-_位置).normalized());
棱镜->设定瞄准点(瞄准点);
返回棱镜;
}    
主要类别:

main()
{
    boost::shared_ptr<Point> p; //initialized somewhere in this code
    boost::shared_ptr<PointPrism> prism = p->getPrismFromAimingPoint(aimingPoint);

    //here it looks like the prism object is just fine
    boost::this_thread::sleep(boost::posix_time::seconds(10));
    //here both VS10 debugger and log prints show that values inside prism are corrupted
}
main()
{
boost::shared_ptr p;//在代码中的某个地方初始化
boost::shared_ptr prism=p->getprismfromingpoint(aimingPoint);
//在这里,棱镜对象看起来很好
boost::this_线程::sleep(boost::posix_时间::秒(10));
//这里,VS10调试器和日志打印都显示prism中的值已损坏
}
据我所知,这意味着在代码中的某个地方,共享的\u ptr引用计数混乱,调用了析构函数,但我不知道在哪里。 有什么想法吗

编辑1:


在<代码>返回棱镜处断开时在VS10中按Alt+Shift+F11(显示将要调用的所有函数)时,我看到boost::shared_ptr ctor和boost::shared_ptr dtor,这(我认为)意味着我以错误的方式返回了shared_ptr。哪里出了什么问题?

好吧,原来是一只虫子(不是我的…邪恶的微笑)在一个完全不同的地方。
PointPrism
类的成员被保存为const引用,这使得它们在创建它们的方法之外被删除。。。
谢谢大家的帮助。

您确定这些对象只用于非拥有的原始指针和共享/弱指针,这些指针是由原始共享指针或其他指针创建的,而不是由原始指针创建的吗?代码与描述完全相同。此处未丢弃任何指针/引用。如果在
boost::this_thread::sleep
调用后添加另一条语句,是否会看到此行为?(例如:添加
int i=0;
作为
main
中的最后一行,并在其处断开)。我猜这就是您记录值的方式,但我想我会仔细检查。我在主函数中还有一些其他调用,包括记录值。无更改看到调用共享ptr的dtor和ctor没有什么错。您返回它时,它正在复制并超出范围。这是正常的行为。您应该在~PointPrism()上附加一个断点,并查看何时调用它。如果它没有定义析构函数,那么就定义一个并执行它。