查看: 1584|回复: 6

OSG源码中多处智能指针与原始指针互转换,安全吗?

[复制链接]

该用户从未签到

发表于 2010-10-22 08:57:15 | 显示全部楼层 |阅读模式
OSG源码中多处智能指针与原始指针互转换,安全吗?

该用户从未签到

发表于 2010-10-22 14:22:57 | 显示全部楼层
“智能指针与原始指针互相转换”,能否举出例子?

源码中有很多new指针,作为返回值传递给智能指针,这个比较常见的。

该用户从未签到

 楼主| 发表于 2010-10-22 14:43:52 | 显示全部楼层
比如这两个函数的使用
void GraphicsContext::setCompileContext(unsigned int contextID, GraphicsContext* gc)
{
    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(s_contextIDMapMutex);
    s_contextIDMap[contextID]._compileContext = gc;
}

GraphicsContext* GraphicsContext::getCompileContext(unsigned int contextID)
{
    // OSG_NOTICE<<"GraphicsContext::getCompileContext "<<contextID<<std::endl;
    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(s_contextIDMapMutex);
    ContextIDMap::iterator itr = s_contextIDMap.find(contextID);
    if (itr != s_contextIDMap.end()) return itr->second._compileContext.get();
    else return 0;
}
还有需要传入原始指针的地方
void GraphicsContext::removeCamera(osg::Camera* camera)
{
    Cameras::iterator itr = std::find(_cameras.begin(), _cameras.end(), camera);
    if (itr != _cameras.end())
    {
        // find a set of nodes attached the camera that we are removing that isn't
        // shared by any other cameras on this GraphicsContext
        typedef std::set<Node*> NodeSet;
        NodeSet nodes;
        for(unsigned int i=0; i<camera->getNumChildren(); ++i)
        {
            nodes.insert(camera->getChild(i));            
        }
        
        for(Cameras::iterator citr = _cameras.begin();
            citr != _cameras.end();
            ++citr)
        {
            if (citr != itr)
            {
                osg::Camera* otherCamera = *citr;
                for(unsigned int i=0; i<otherCamera->getNumChildren(); ++i)
                {
                    NodeSet::iterator nitr = nodes.find(otherCamera->getChild(i));
                    if (nitr != nodes.end()) nodes.erase(nitr);
                }
            }            
        }
        
        // now release the GLobjects associated with these non shared nodes
        for(NodeSet::iterator nitr = nodes.begin();
            nitr != nodes.end();
            ++nitr)
        {
            const_cast<osg::Node*>(*nitr)->releaseGLObjects(_state.get());
        }

        // release the context of the any RenderingCache that the Camera has.
        if (camera->getRenderingCache())
        {
            camera->getRenderingCache()->releaseGLObjects(_state.get());
        }

        _cameras.erase(itr);

    }
}
等等吧。
没有仔细看过源码,只是觉得这样存在安全隐患

该用户从未签到

发表于 2010-10-22 16:00:45 | 显示全部楼层
我不认为这样会带来什么安全隐患,因为最终的管理是使用ref_ptr的

您能否叙述一下您的看法?

该用户从未签到

 楼主| 发表于 2010-10-22 16:54:05 | 显示全部楼层
调用get()之后,就把所有权交出去啦。特别是传给另一个线程使用。
OSG中如何保证所有权的收发自如啊。
好像没有Boost、Loki等对智能指针对所有权的管理那么严谨。
盼指教

该用户从未签到

发表于 2010-10-25 08:53:11 | 显示全部楼层
get()并不会影响到智能指针的管理,它只是获取内部保存的对象;只要智能指针在使用过程中不被销毁,就不会发生任何问题

该用户从未签到

 楼主| 发表于 2010-10-27 09:12:07 | 显示全部楼层
谢谢Array
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表