使用lambdas对std :: function赋值进行访问冲突

时间:2013-06-03 01:09:02

标签: c++ visual-c++ c++11 access-violation physx

Hy大家,再来一次。继续我之前提问的代码:Is this a bad hack? memcpy with virtual classes 我更正了,按照建议使用克隆方法,但我遇到了一个错误,也是在我尝试memcpy之前发生的错误(请参阅上面的问题)。

我要做的是创建一个捕获当前脚本并执行它的lambda,然后将该lambda传递并存储在成员InternalCallback中的对象(Trigger *)中。 我在lambda赋值中遇到访问冲突错误:http://imgur.com/OKLMJpa 错误仅在此代码的第4次迭代时发生:

if(CheckHR(EnginePTR->iPhysics->CreateFromFile(physicsPath,StartingTriggerID,trans,scale,-1,false,engPtr)) == HR_Correct)
{
     _Lua::ScriptedEntity * newScript = EntityBase->Clone(vm);//nullptr;

     string luaPath = transforms.next_sibling().next_sibling().first_attribute().as_string();
     if(UseRelativePaths)
     { 
         stringstream temp2;
         temp2 << _Core::ExePath() << LuaSubfolder << "\\" << luaPath;
         luaPath = temp2.str();
     }

     newScript->CompileFile(luaPath.c_str());
     newScript->EnginePTR_voidptr = engPtr;

     auto callback = [=](_Physics::Trigger* trigger,PxTriggerPair* pairs, PxU32 count) 
                        {
                            newScript->SelectScriptFunction("TriggerCallback");
                            newScript->AddParam(trigger->Id);

                            auto data = (_Physics::RayCastingStats*)pairs->otherShape->userData;

                            newScript->AddParam((PxU8)pairs->flags);
                            newScript->AddParam(data->ID);
                            newScript->AddParam((int)data->Type);

                            newScript->AddParam((int)count);

                            newScript->Go(1);

                            return;
                        };

     ((_Physics::Trigger*)EnginePTR->iPhysics->GetPhysicObject(StartingTriggerID))->InternalCallback = callback;

     StartingTriggerID++;
}

这是Trigger的代码

class Trigger : public PhysicObject
    {
    public:
        Trigger()
        {
            ActorDynamic = nullptr;
            ActorStatic = nullptr;
            InternalCallback = nullptr;
        }
        virtual HRESULT Update(float ElapsedTime,void * EnginePTR);
        virtual HRESULT Cleanup(); // Release the actor!!

        long Id;
        ShapeTypes Type;
        static const PhysicObjectType PhysicsType = PhysicObjectType::Trigger;
        PxVec3 Scale;

        void* UserData;
        void Callback(PxTriggerPair* pairs,PxU32 count)
        {
            InternalCallback(this,pairs,count);
        }

        function<void(_Physics::Trigger* trigger,PxTriggerPair* pairs, PxU32 count)> InternalCallback;
    };

迭代我的意思是它是for循环的一部分。 我的系统是使用C ++ 11工具集的Win 7 64位,Intel i3,NVIDIA GTX 480和编译器Visual Studio 2012 Express。 我真的没有想法。我测试了堆损坏,它看起来很好,我改变了lambda中的捕获,没有改变,我跳过第4个对象并且它有效。 任何帮助都会非常感激。

编辑:根据需要,这里是callstack:http://imgur.com/P7P3t4k

1 个答案:

答案 0 :(得分:0)

解决。这是一个设计错误。我在地图中存储了很多对象,它们都来自一个对象类(如上所述,Trigger派生自PhysicObject)。 问题是我有ID冲突,因此存储在ID 5中的对象不是触发器,因此强制转换创建了一个坏对象,因此程序崩溃了。

愚蠢的错误,非常具体,但它可能有助于某人记住检查时态对象。