2013-06-03 8 views
0

Hy все, здесь снова. Продолжая код из моего предыдущего вопроса: Is this a bad hack? memcpy with virtual classes Я исправил это, используя подход Clone, как было предложено, но у меня ошибка, которая также произошла до того, как я попробовал memcpy (прочитал вопрос выше).Нарушение прав доступа на std :: function assignement с использованием lambdas

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

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

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; 
    }; 

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

Edit: Как требуется, здесь CallStack: http://imgur.com/P7P3t4k

+0

Uhm - ошибка не дает большой информации, людям нужно будет увидеть столбец в деталях. – kfsone

+0

Стол вызовов находится слева, но я загружу новый с помощью только стека вызовов –

ответ

0

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

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