使用lambda对std::函数赋值时的访问冲突
Access violation on std::function assignement using lambdas
大家好,又来了。继续我上一个问题的代码:这是一个糟糕的黑客吗?记忆与虚拟类我纠正了这一点,使用克隆方法建议,但我有一个错误,也发生在我尝试记忆的事情(阅读上面的问题)。
我要做的是创建一个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中的对象不是触发器,所以强制转换创建了一个坏对象,所以程序崩溃了。
愚蠢的错误,非常具体,但它可能会帮助某人记住检查时间对象
相关文章:
- 使用 ReadProcessMemory 获取字符串值的访问冲突
- 是否可以使用宏来访问动态数组或向量中的元素或为其赋值
- 复制赋值函数如何访问另一个对象的私有成员(Stroustroup 原则和实践书)?
- C++:向量元素赋值导致访问冲突
- 如何区分数组索引的访问和赋值?
- 无法在赋值运算符中访问基类的受保护方法
- 赋值运算符重载在通过指针访问时不调用
- 将派生类对象赋值和访问到基类 "pointer to pointer" C++ 中的对象
- 在为矩阵分配值时访问冲突写入位置0x00000000
- 从C#返回调用C++dll函数的值时发生访问冲突
- 默认赋值运算符有权访问基类的私有成员
- 取消引用刚刚插入的 std::map 值有时会导致访问冲突
- 用于独立访问器/赋值器接口的C++设计模式
- 我尝试访问win32应用程序中的空指针值,但没有发生访问冲突
- 访问器方法和赋值器方法之间的区别是什么
- 试图从地址中获取值会导致访问冲突
- 按值传递va_list时访问冲突
- 使用lambda对std::函数赋值时的访问冲突
- 给map vector容器的元素赋值时发生访问冲突
- 赋值变量时c++未处理异常访问冲突