大家好,又来了。继续我之前的问题中的代码:这是一个糟糕的黑客攻击吗?memcpy 与虚拟类 我纠正了这一点,按照建议使用克隆方法,但我遇到了一个错误,在我尝试 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++;
}
这是触发器的代码
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 工具集。我真的没主意了。我测试了堆损坏,看起来不错,我更改了 lambda 中的捕获,没有更改任何内容,我跳过了第 4 个对象并且它可以工作。任何帮助将非常感激。
编辑:根据需要,这里是调用堆栈:http: //imgur.com/P7P3t4k