<work.exe> 0xC0000005中的0x002a2da2处的NVIDIA未处理异常:访问冲突读取位置0x00000000 </work.exe>

时间:2013-01-01 18:43:23

标签: c++ visual-studio-2010 nvidia

我目前正试图在一个角色上制作两个武器并使用NxRevoluteJoint进行移动。我已经将这些工作完美地放在另一个已经作为示例给出的程序中,并且我在这个新项目中使用了相同的代码,但是我收到了一个错误(标题中的那个),我正在努力解决它。我知道指针在某个地方引用了NULL,但我看不出如何对其进行排序。

变量全局设置:

NxRevoluteJoint* playerLeftJoint= 0;
NxRevoluteJoint* playerRightJoint= 0;

这是单独功能中的代码,其中播放器被构建为复合对象:

NxVec3 globalAnchor(0,1,0);     
NxVec3 globalAxis(0,0,1);       

playerLeftJoint= CreateRevoluteJoint(0,actor2,globalAnchor,globalAxis);
playerRightJoint= CreateRevoluteJoint(0,actor2,globalAnchor,globalAxis);


//set joint limits
NxJointLimitPairDesc limit1;
limit1.low.value = -0.3f;
limit1.high.value = 0.0f;
playerLeftJoint->setLimits(limit1);


NxJointLimitPairDesc limit2;
limit2.low.value = 0.0f;
limit2.high.value = 0.3f;
playerRightJoint->setLimits(limit2);    

NxMotorDesc motorDesc1;
motorDesc1.velTarget = 0.15;
motorDesc1.maxForce = 1000;
motorDesc1.freeSpin = true;
playerLeftJoint->setMotor(motorDesc1);

NxMotorDesc motorDesc2;
motorDesc2.velTarget = -0.15;
motorDesc2.maxForce = 1000;
motorDesc2.freeSpin = true;
playerRightJoint->setMotor(motorDesc2);

我收到错误的行位于playerLeftJoint->setLimits(limit1);

1 个答案:

答案 0 :(得分:1)

CreateRevoluteJoint返回一个空指针,就像那样简单。错误消息非常清楚指针的值为0。当然,你没有发布这个功能,所以这是我能给你的最好的信息。就这样,这一行;

playerLeftJoint->setLimits(limit1);

取消引用指针playerLeftJoint,这是一个无效指针。你需要初始化你的指针。我看不到你的整个程序结构,所以在这种情况下,最简单的修复就像是;

if(!playerLeftJoint)
    playerLeftJoint = new NxRevoluteJoint();

// same for the other pointer, now they are valid

此外,由于这是C ++而不是C,请使用智能指针为您处理内存,即

#include <memory>

std::unique_ptr<NxRevoluteJoint> playerLeftJoint;

// or, if you have a custom deallocater...
std::unique_ptr<NxRevoluteJoint, RevoluteJointDeleter> playerLeftJoint;

// ...

playerLeftJoint.reset(new NxRevoluteJoint(...));