使用lambda对std::函数赋值时的访问冲突

Access violation on std::function assignement using lambdas

本文关键字:访问冲突 赋值 函数 std 使用 lambda      更新时间:2023-10-16

大家好,又来了。继续我上一个问题的代码:这是一个糟糕的黑客吗?记忆与虚拟类我纠正了这一点,使用克隆方法建议,但我有一个错误,也发生在我尝试记忆的事情(阅读上面的问题)。

我要做的是创建一个lambda,捕获当前脚本并执行它,然后在成员InternalCallback中传递并存储该lambda中的对象(Trigger*)。
我在lambda赋值上得到一个访问冲突错误:https://i.stack.imgur.com/E2jiY.jpg这个错误只在这段代码的第四次迭代时发生:

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++;
}
这是触发器 的代码
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循环的一部分。我的系统是win7 64位,Intel i3, NVIDIA GTX 480,编译器是Visual Studio 2012 Express,使用c++ 11工具集。我真的没有主意了。我测试了堆损坏,它看起来很好,我改变了lambda中的捕获,什么也没改变,我跳过了第4个对象,它工作了。如有任何帮助,我将不胜感激。

编辑:根据需要,这里是callstack: https://i.stack.imgur.com/UM86A.jpg

解决。这是一个设计错误。我在一个映射中存储了很多对象,它们都派生自一个对象类(就像上面那样,Trigger派生自PhysicObject)。问题是我有ID冲突,所以存储在ID 5中的对象不是触发器,所以强制转换创建了一个坏对象,所以程序崩溃了。

愚蠢的错误,非常具体,但它可能会帮助某人记住检查时间对象