Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;-对象在执行析构函数之前被销毁_C++_Destructor - Fatal编程技术网

C++ C++;-对象在执行析构函数之前被销毁

C++ C++;-对象在执行析构函数之前被销毁,c++,destructor,C++,Destructor,我有一个类,它有一个指向动态分配的实例(wallGameObjects)的2D指针向量,我想在调用析构函数时删除这些实例,但当析构函数执行向量时,这些实例已经被销毁 析构函数调用removeMaze(): 并且对象的成员变量已经消失: void MazeSceneBuilder::removeMaze() { // Remove walls for (unsigned int x = 0; x < mazeWidth; x++) { for (uns

我有一个类,它有一个指向动态分配的实例(wallGameObjects)的2D指针向量,我想在调用析构函数时删除这些实例,但当析构函数执行向量时,这些实例已经被销毁

析构函数调用removeMaze():

并且对象的成员变量已经消失:

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]);
        }
    }
}