C++ C++;-对象在执行析构函数之前被销毁
我有一个类,它有一个指向动态分配的实例(wallGameObjects)的2D指针向量,我想在调用析构函数时删除这些实例,但当析构函数执行向量时,这些实例已经被销毁 析构函数调用removeMaze(): 并且对象的成员变量已经消失:C++ C++;-对象在执行析构函数之前被销毁,c++,destructor,C++,Destructor,我有一个类,它有一个指向动态分配的实例(wallGameObjects)的2D指针向量,我想在调用析构函数时删除这些实例,但当析构函数执行向量时,这些实例已经被销毁 析构函数调用removeMaze(): 并且对象的成员变量已经消失: void MazeSceneBuilder::removeMaze() { // Remove walls for (unsigned int x = 0; x < mazeWidth; x++) { for (uns
void MazeSceneBuilder::removeMaze()
{
// Remove walls
for (unsigned int x = 0; x < mazeWidth; x++)
{
for (unsigned int z = 0; z < mazeWidth; z++)
{
if (wallGameObjects[x][z] != nullptr)
{
mGameObjectManager->removeGameObject(wallGameObjects[x][z]);
}
}
}
// remove ground
mGameObjectManager->removeGameObject(groundGameObject);
// Destroy collision shapes
destroyCollisionShapes();
}
物理世界:
void MultiplayerMaze::destroyPhysicsWorld()
{
delete dynamicsWorld;
delete solver;
delete collisionConfiguration;
delete dispatcher;
delete broadphase;
}
编辑2:
多层化类定义:
class MultiplayerMaze : public BaseApplication
{
public:
MultiplayerMaze();
virtual ~MultiplayerMaze();
protected:
virtual void createScene();
virtual bool frameRenderingQueued(const Ogre::FrameEvent& evt);
virtual bool configure();
virtual void createPhysicsWorld();
virtual void destroyPhysicsWorld();
// Physics members
btBroadphaseInterface* broadphase;
btDefaultCollisionConfiguration* collisionConfiguration;
btCollisionDispatcher* dispatcher;
btSequentialImpulseConstraintSolver* solver;
btDiscreteDynamicsWorld* dynamicsWorld;
GameObjectManager gameObjectManager;
MazeSceneBuilder mazeSceneBuilder;
MazeGenerator mazeGenerator;
};
class MazeSceneBuilder
{
protected:
std::vector<std::vector<bool>> mMaze;
unsigned int mazeWidth, mazeHeight;
float mMazeScale;
GameObjectManager* mGameObjectManager;
Ogre::SceneManager* mSceneManager;
Ogre::String mWallEntity;
Ogre::String mGroundMaterial;
Ogre::Entity* mGround;
Ogre::SceneNode* mazeNode;
btCollisionShape* wallCollisionShape;
btCollisionShape* collisionPlanes[5];
GameObject* groundGameObject;
std::vector<std::vector<GameObject*>> wallGameObjects;
void setupGround(); // Creates a plane entity using the ground materiala and the maze size.
void createCollisionShapes(); // Create collision shapes for the wall, ground, and bounding planes.
void destroyCollisionShapes();
void DestroyAllAttachedMovableObjects(Ogre::SceneNode* sceneNode);
public:
MazeSceneBuilder();
MazeSceneBuilder(GameObjectManager* gameObjectManager);
~MazeSceneBuilder();
void setGameObjectManager(GameObjectManager* gameObjectManager);
bool setMaze(std::vector<std::vector<bool>> maze); // Returns false if the provided maze was invalid.
void setMazeScale(float scale);
void setWallEntity(Ogre::String entityName); // Must be a square cuboid of 1x2x1
void setGroundMaterial(Ogre::String materialName); // Should be a tiled square texture.
void buildMaze();
void updateMaze(const std::vector<std::vector<bool>>& maze);
void removeMaze();
};
MazeSceneBuilder类定义:
class MultiplayerMaze : public BaseApplication
{
public:
MultiplayerMaze();
virtual ~MultiplayerMaze();
protected:
virtual void createScene();
virtual bool frameRenderingQueued(const Ogre::FrameEvent& evt);
virtual bool configure();
virtual void createPhysicsWorld();
virtual void destroyPhysicsWorld();
// Physics members
btBroadphaseInterface* broadphase;
btDefaultCollisionConfiguration* collisionConfiguration;
btCollisionDispatcher* dispatcher;
btSequentialImpulseConstraintSolver* solver;
btDiscreteDynamicsWorld* dynamicsWorld;
GameObjectManager gameObjectManager;
MazeSceneBuilder mazeSceneBuilder;
MazeGenerator mazeGenerator;
};
class MazeSceneBuilder
{
protected:
std::vector<std::vector<bool>> mMaze;
unsigned int mazeWidth, mazeHeight;
float mMazeScale;
GameObjectManager* mGameObjectManager;
Ogre::SceneManager* mSceneManager;
Ogre::String mWallEntity;
Ogre::String mGroundMaterial;
Ogre::Entity* mGround;
Ogre::SceneNode* mazeNode;
btCollisionShape* wallCollisionShape;
btCollisionShape* collisionPlanes[5];
GameObject* groundGameObject;
std::vector<std::vector<GameObject*>> wallGameObjects;
void setupGround(); // Creates a plane entity using the ground materiala and the maze size.
void createCollisionShapes(); // Create collision shapes for the wall, ground, and bounding planes.
void destroyCollisionShapes();
void DestroyAllAttachedMovableObjects(Ogre::SceneNode* sceneNode);
public:
MazeSceneBuilder();
MazeSceneBuilder(GameObjectManager* gameObjectManager);
~MazeSceneBuilder();
void setGameObjectManager(GameObjectManager* gameObjectManager);
bool setMaze(std::vector<std::vector<bool>> maze); // Returns false if the provided maze was invalid.
void setMazeScale(float scale);
void setWallEntity(Ogre::String entityName); // Must be a square cuboid of 1x2x1
void setGroundMaterial(Ogre::String materialName); // Should be a tiled square texture.
void buildMaze();
void updateMaze(const std::vector<std::vector<bool>>& maze);
void removeMaze();
};
class MazeSceneBuilder
{
受保护的:
std::向量mMaze;
无符号整数mazeWidth,mazeHeight;
浮标;
GameObjectManager*mGameObjectManager;
食人魔::场景管理员*mSceneManager;
食人魔:字符串mWallenty;
食人魔::字符串材料;
食人魔::实体*mGround;
食人魔:斯奇诺德*马奇诺德;
btCollisionShape*墙碰撞形状;
btCollisionShape*碰撞平面[5];
游戏对象*地面游戏对象;
向量对象;
void setupGround();//使用地面材质和迷宫大小创建平面图元。
void createCollisionShapes();//为墙、地面和边界平面创建碰撞形状。
void destructionshapes();
void destructionAllattachedMovableObjects(食人魔::场景节点*场景节点);
公众:
MazeSceneBuilder();
MazeSceneBuilder(GameObjectManager*GameObjectManager);
~MazeSceneBuilder();
void setGameObjectManager(GameObjectManager*GameObjectManager);
bool setMaze(std::vector maze);//如果提供的迷宫无效,则返回false。
无效设置刻度(浮动刻度);
void setWallEntity(Ogre::String entityName);//必须是1x2x1的方形长方体
void setGroundMaterial(Ogre::String materialName);//应该是平铺方形纹理。
void buildMaze();
void updateMaze(const std::vector&maze);
void-removeMaze();
};
这可能与析构函数无关,但请查看:
// Remove walls
for (unsigned int x = 0; x < mazeWidth; x++)
{
for (unsigned int z = 0; z < mazeWidth; z++)
{
if (wallGameObjects[x][z] != nullptr)
{
mGameObjectManager->removeGameObject(wallGameObjects[x][z]);
}
}
}
//移除墙壁
for(无符号整数x=0;xremoveGameObject(wallGameObjects[x][z]);
}
}
}
您可以使用mazeWidth
两次。您不应该使用mazeHeight
?如果迷宫不是方形的,你可能会在wallGameObjects
中使用一些未初始化的指针,产生不可预见的副作用,特别是如果这些对象有一个破坏其他对象的析构函数,等等
由于类很复杂,我建议尽可能使用
std::unique\u ptr
来建模所有权。它将帮助您跟踪错误。您能看一下调用堆栈并检查在哪里调用析构函数,如果它没有自动调用,请在调用构造函数的那一行上写下它吗?这可以是NulLPTR,但是只有当指针在构造函数上调用构造函数,即Null pTR时,你才能在一个C++语言实现缺陷之间选择,b)宇宙射线粒子翻转了一个RAM位,C)你的代码损坏堆。a和b是比较容易消除的。@Muepe它在析构函数:Multiplayer Maze.exe之后被调用!MazeSceneBuilder::RevVimaZe()192行C++多人游戏!MazeSceneBuilder:~ MaZeSeNeBueDele[()30行C++,我不从其他地方调用它,为什么?@ YNOI0505不从何处调用RevVeMaZE,但从哪里调用构造函数?您是手动删除您的对象,还是从超出范围的对象中删除自动析构函数?@yoni0505-但您没有禁用复制。因此,如果一个副本是MazeSceneBuilder对象的副本,那么您的程序将显示未定义的行为。但说真的,我们需要一个运行的程序来看看你是如何使用这些类的。所有这些指针和成员都有太多可能出错的地方。如果不能消除您现在存在的问题,也许重新编写代码以使用智能指针而不是裸指针会有很大帮助。感谢您指出这一点,但问题仍然是所有成员变量(包括mazeWidth和mazeHeight)都已发布。所以这个bug是不相关的。用null调用MazeSceneBuilder
的析构函数的唯一方法是跳过delete
所做的null检查。现在我推测:如果MazeSceneBuilder
在堆栈上或者是另一个类的成员,比如multipleayermaze
,这可能是可能的。它的生命周期是什么?如何删除多层化
?基本应用程序的内部是什么?
// Remove walls
for (unsigned int x = 0; x < mazeWidth; x++)
{
for (unsigned int z = 0; z < mazeWidth; z++)
{
if (wallGameObjects[x][z] != nullptr)
{
mGameObjectManager->removeGameObject(wallGameObjects[x][z]);
}
}
}