对象的访问冲突
Access violation for object
>我有一个像这样的Entity.h:
使用命名空间 physx;
class Entity
{
public:
Entity(Ogre::Vector3 dims, Ogre::Vector3 pos, std::string mesh, std::string id);
virtual ~Entity(void);
virtual void update(Ogre::Real dt);
virtual void init(Ogre::SceneManager* sceneMgr, PxPhysics* physics, PxScene* scene, PxVec3 velocity=PxVec3(0, 0, 0));
protected:
Ogre::Entity* mOgreEntity = NULL;
Ogre::SceneNode* mOgreNode = NULL;
Ogre::Vector3 mPosition;
Ogre::Vector3 mDimensions;
std::string mMesh;
std::string mId;
PxRigidDynamic* mActor;
PxMaterial* mMaterial;
};
这是我的实体来源:
#include "Entity.h"
Entity::Entity(Ogre::Vector3 dims, Ogre::Vector3 pos, std::string mesh, std::string id)
{
mDimensions = dims;
mPosition = pos;
mMesh = mesh;
mId = id;
mActor = NULL;
mMaterial = NULL;
}
Entity::~Entity(void)
{
}
void Entity::update(Ogre::Real dt)
{
PxVec3 pos = mActor->getGlobalPose().p;
Ogre::Real r = 0;
mOgreNode->setPosition(Ogre::Vector3(pos.x + r, pos.y + r, pos.z + r));
}
void Entity::init(Ogre::SceneManager* sceneMgr, PxPhysics* physics, PxScene* scene, PxVec3 velocity)
{
// Create an Entity
mOgreEntity = sceneMgr->createEntity(mId, mMesh);
mOgreEntity->setCastShadows(true);
// Create a SceneNode and attach the Entity to it
mOgreNode = sceneMgr->getRootSceneNode()->createChildSceneNode(mId + "Node");
Ogre::AxisAlignedBox box = mOgreEntity->getBoundingBox();
Ogre::Vector3 realSizes = box.getSize();
mOgreNode->setPosition(mPosition);
mOgreNode->attachObject(mOgreEntity);
Ogre::Vector3 scaler = Ogre::Vector3(mDimensions.x / realSizes.x, mDimensions.y / realSizes.y, mDimensions.z / realSizes.z);
mOgreNode->scale(scaler);
mMaterial = physics->createMaterial(1.5f, 1.5f, 1.0f);
PxGeometry* geometry = NULL;
if(mMesh == "sphere.mesh")
{
PxGeometry g = PxSphereGeometry(mDimensions.x / 2); // Because it's a radius
geometry = &g;
} else {
// geometry = NULL;
}
PxTransform transform = PxTransform(PxVec3(mPosition.x, mPosition.y, mPosition.z));
mActor = PxCreateDynamic(*physics, transform, *geometry, *mMaterial, PxReal(.1));
// if(!mActor) {
// MessageBox( NULL, "no actor", "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
// return;
// }
mActor->setLinearVelocity(velocity);
// And add the actor to a scene:
scene->addActor(*mActor);
}
现在,如果我创建一个实体并初始化它就可以了。即使有第二个实体变量,它也可以工作。现在有一个数组:
Entity *mEntities[20];
for(int i = 0 ; i < 20 ; i++ ){
ostringstream nameStream;
nameStream << "Sphere_" << i;
string name = nameStream.str();
Entity* sphere = new Entity(Ogre::Vector3(i*5, i*4.5, i*6), Ogre::Vector3(i*5, i*4.5, i*6), "sphere.mesh", name);
sphere->init(mSceneMgr, mPhysics, gScene, PxVec3(-10.0f, 0, 0));
mEntities[i] = sphere;
}
我得到了Access violation
.使用实时调试器,事实证明mActor
为空且mMaterial
编辑:
此代码也不起作用:
mEntity = Entity(Ogre::Vector3(50.0f, 50.0f, 50.0f), Ogre::Vector3(50.0f, 40.5f, 60.0f), "sphere.mesh", "sphere");
mEntity.init(mSceneMgr, mPhysics, gScene, PxVec3(-10.0f, 0, 0));
1(
Entity* sphere = new Entity(Ogre::Vector3(i*5, i*4.5, i*6),
Ogre::Vector3(i*5, i*4.5, i*6),
"sphere.mesh",
"Sphere_"+i);
看看"Sphere_"+i
如果i
较大,则长度为"Sphere_",您将指针传递给某个随机内存。我假设您想创建一个末尾带有 i 的字符串。
为此使用sprintf
或std::string
。
2(
如果将循环范围从 20 更改为 3,则可能会起作用。问题是你的名字将是:
Sphere_、phere_here_
因为通过执行"Sphere_"+i
您不会向字符串添加整数。
这"等于":
char *string = "String";
string += 3;
3(
此代码将生成您需要的字符串:
std::ostringstream newStringStream;
newStringStream << "Sphere_" << i;
std::string newString = newStringStream.str();
这是另一个问题:
PxGeometry* geometry = NULL;
if(mMesh == "sphere.mesh")
{
geometry = &PxSphereGeometry(mDimensions.x / 2); // Because it's a radius
}
这样做的问题是您要分配临时值的地址geometry
。 一旦那行代码完成,临时代码就消失了。
可能的解决方法是执行以下操作:
PxGeometry geometry;
if(mMesh == "sphere.mesh")
{
geometry = PxSphereGeometry(mDimensions.x / 2); // Because it's a radius
}
//...
mActor = PxCreateDynamic(*physics, transform, geometry, *mMaterial, PxReal(.1));
现在geometry
不再是指针,您将几何图形分配给返回的值(而不是返回值的地址(。
我正在阅读这里的文档:
http://docs.nvidia.com/gameworks/content/gameworkslibrary/physx/apireference/files/classPxSphereGeometry.html
所以PxSphereGeometry(x)
是一个构造函数调用。 因此,您需要将返回value
分配给PxShpereGeometry
,而不是PxSphereGeometry*
。
编辑:您的最新更改也没有达到预期的效果:
if(mMesh == "sphere.mesh")
{
PxGeometry g = PxSphereGeometry(mDimensions.x / 2); // Because it's a radius
geometry = &g;
}
g
是if()
块的本地。 将此g
的地址分配给 geometry
。 然后当那个块退出时,g
消失了,现在你geometry
指向不再存在的东西。
您编辑的代码与我给出的答案之间的区别在于,我的答案assigns
现有对象的返回值。 所以我创建了一个返回值的副本。 您在编辑的代码中执行的操作不是创建重复项,而是指向本地对象,如前所述,该对象在离开范围后将不存在。
因此,如果您要编写遵循已编辑代码模式的代码,并且使其有效,则更改将如下所示:
PxGeometry geometry;
if(mMesh == "sphere.mesh")
{
PxGeometry g = PxSphereGeometry(mDimensions.x / 2); // Because it's a radius
geometry = g;
}
但是,这确实是无关紧要的工作。 最初的答案就足够了。
我尝试了另一种方法来创建一个刚体,它奏效了!!!
mActor = physics->createRigidDynamic(PxTransform(PxVec3(mPosition.x, mPosition.y, mPosition.z)));
PxShape* shape = mActor->createShape(PxSphereGeometry(mDimensions.x / 2), *mMaterial);
PxRigidBodyExt::updateMassAndInertia(*mActor, 0.4f);
- 写入位置0x0000000C时发生访问冲突
- 在 DLL 中嵌入 Python:Py_DECREF列表对象时访问冲突读取位置
- 为什么我的顶点缓冲区对象出现访问冲突错误?
- 尝试创建结构对象,在位置0x3FE00000中创建访问冲突写入错误
- 存储类对象的C++模板链表-未处理的异常访问冲突读取位置
- 访问用于对象的向量时读取冲突
- 创建具有自动存储的自定义对象并推送回 std::vector 时访问冲突
- 使用指向对象实例的指针列表的访问冲突
- 返回指针会扰乱对象(访问冲突)
- MFC:在工作线程中使用对象的成员函数时获取访问冲突错误
- C++对象数组的访问冲突
- C++ xerces 对象的序列化会导致访问冲突
- 对象的访问冲突
- 对象向量中的内存访问冲突
- 创建对象时发生SSE访问冲突崩溃
- 使用对象指针时读取访问冲突
- C++,为什么在修改新分配的对象后会出现访问冲突
- c++类:创建线程的对象+指向函数的指针=访问冲突
- 在初始化列表中创建单例对象会导致访问冲突(仅释放模式)
- 试图读取充满对象的矢量时发生访问冲突