Привет всем, здесь снова. Продолжая код из моего предыдущего вопроса: Это плохой взлом? memcpy с виртуальными классами
Я исправил это, используя подход Clone, как было предложено, но у меня возникла ошибка, которая также произошла до того, как я попробовал memcpy (см. Вопрос выше).
Я пытаюсь создать лямбду, которая захватывает текущий скрипт и выполняет его, а затем передает и сохраняет эту лямбду в объекте (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;
};
Под итерацией я подразумеваю, что это часть цикла for.
Моя система — Win 7 64 бит, Intel i3, NVIDIA GTX 480 и компилятор Visual Studio 2012 Express, использующий набор инструментов C ++ 11.
У меня действительно нет идей. Я проверил на повреждение кучи, это, кажется, хорошо, я изменил захват в лямбду, ничего не изменил, я пропускаю 4-й объект, и он работает.
Любая помощь могла бы быть полезна.
Редактировать: по мере необходимости, вот callstack: http://imgur.com/P7P3t4k
Решаемые. Это была ошибка дизайна. Я храню много объектов на карте, и все они происходят от класса объектов (как выше, где Trigger наследуется от PhysicObject).
Проблема заключалась в том, что у меня возникали коллизии идентификаторов, поэтому объект, хранящийся в идентификаторе 5, не был триггером, поэтому приведение создало плохой объект, и программа потерпела крах.
Глупая ошибка, действительно специфическая, но она может помочь кому-то вспомнить, чтобы проверить временные объекты.
Других решений пока нет …