Нарушение доступа при назначении std::function с помощью лямбды

Привет всем, здесь снова. Продолжая код из моего предыдущего вопроса: это плохой взлом? memcpy с виртуальными классами Я исправил это, используя предложенный подход клонирования, но у меня возникла ошибка, которая также произошла до того, как я попробовал memcpy (см. вопрос выше).

Я пытаюсь создать лямбду, которая захватывает текущий скрипт и выполняет его, а затем передает и сохраняет эту лямбду в объекте ( Trigger*), в члене InternalCallback.
Я получаю ошибку нарушения доступа при лямбда-присваивании: https://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++;
}

Это код для триггера

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. Моя система - Win 7 64 бит, Intel i3, NVIDIA GTX 480 и компилятор Visual Studio 2012 Express, использующий набор инструментов C++11. У меня действительно нет идей. Я проверил на повреждение кучи, это, кажется, хорошо, я изменил захват в лямбду, ничего не изменил, я пропускаю 4-й объект, и он работает. Любая помощь могла бы быть полезна.

Изменить: По мере необходимости, вот стека вызовов: https://imgur.com/P7P3t4k

1 ответ

Решение

Решаемые. Это была ошибка дизайна. Я храню много объектов на карте, и все они являются производными от класса объектов (как выше, где Trigger является производным от PhysicObject). Проблема заключалась в том, что у меня возникали коллизии идентификаторов, поэтому объект, хранящийся в идентификаторе 5, не был триггером, поэтому приведение создало плохой объект, и программа потерпела крах.

Глупая ошибка, действительно специфическая, но она может помочь кому-то вспомнить, чтобы проверить временные объекты.

Другие вопросы по тегам