1

作为我从学校获得的作业的一部分,我一直在尝试解决这个分配/销毁问题,基本上我需要分配一个我设计的简单类的二维数组指针。

class RobotsWorld{
public:
    RobotsWorld(int width,int hight);
    ~RobotsWorld();
    /**
     * copy,Assign,operator=
     */
    //RobotsWorld(const RobotsWorld &);
    //void Assign(const RobotsWorld &);
    //RobotsWorld& operator=(const RobotsWorld &);


    bool addRobot(Robot & r,Point p);
    bool moveRobot(Robot & r);
    bool removeRobot(Robot & r);
    Point getPosition(Robot r);
    string toString();

    Robot* getRobotInWorld(Robot & r);

    /** validation functions **/
    bool checkOutOfBounds(int,int);
    bool isEmptySlot(int x,int y);
    bool ableToMove(Robot &);




private:
    Robot*** robots;
    Point point;
    int width,height;
};

这不是函数的完整源文件,但这些函数会导致崩溃\内存丢失。(是的,它必须被定义为三重指针 - ***机器人)

RobotsWorld::RobotsWorld(int width,int height)
:width(width),height(height)
{
    robots = new Robot**;
    *robots = new Robot*[height];

    for(int i = 0 ; i < height ; i++){
        robots[i] = new Robot*[width];
        for(int j = 0 ; j < width ; j++)
            robots[i][j] = NULL;
    }

}

RobotsWorld::~RobotsWorld(){

    for(int i = 0 ; i < height ; i++){
        delete [] robots[i];
        robots[i] = NULL;
    }
    delete [] *robots;
    delete **robots;
}

机器人类和主类没有分配什么。我一直在努力寻找解决方案,但即使描述这种情况也证明自己很困难。

4

6 回答 6

4

您需要两个嵌套循环来删除 2D 指针数组 - 删除单个机器人,并删除机器人行:

RobotsWorld::~RobotsWorld(){
    for(int i = 0 ; i < height ; i++) {
        for(int j = 0 ; j < width ; j++) {
            delete robots[i][j]; // Delete each individual robot
        }
        delete[] robots[i]; // Delete the row of robots
    }
    // Finally delete the 2D array itself
    delete[] robots;
}

虽然NULL在删除后设置指针通常是个好主意,但在析构函数中这样做会浪费 CPU 周期;我建议跳过。

这是很多工作(我相信你可以看到)。使用标准 C++ 库可以通过使用合适的容器来帮助您避免所有这些工作 - 比如说,

vector<vector<unique_ptr<Robot> > > robots;

现在,与管理机器人内存相关的任务将自动处理。

于 2012-11-17T23:34:20.313 回答
1

最后一行:

delete **robots;

很可能是你的问题。它应该是:

delete robots;
于 2012-11-17T23:34:41.603 回答
1
robots = new Robot**;
*robots = new Robot*[height];

不正确,你想要

robots = new Robot**[height];
于 2012-11-17T23:37:30.080 回答
0

您想要存储指向 Robot 的二维指针数组。这是一个可能的初始化例程:

RobotsWorld::RobotsWorld(int width,int height)
:width(width),height(height)
{
  robots = new (Robot**)[height];

  for(int i = 0 ; i < height ; i++){
      (*robots)[i] = new (Robot*)[width];
      for(int j = 0 ; j < width ; j++)
          robots[i][j] = NULL;
  }
}

析构函数应该实现双重操作。

于 2012-11-17T23:56:47.870 回答
0

我在这个答案中复制我的评论:

您还可以使用:

template <int WIDTH, int HEIGHT> 
class RobotsWorld
{
  public:
     /*... functions ...*/

  private:
     Robot robots[WIDTH][HEIGHT];
     /*... other private data ...*/
 };

而且你不必关心new/delete东西;-)

但是,您必须实现一些operators 才能允许:

RobotsWorld<3,4> rw34; 
RobotsWorld<5,6> rw56 = rw34;
if (rw56 == rw34) /*...*/;

如果您不需要像上面那样允许操作,那么template这是一个优雅的解决方案。

于 2012-11-17T23:43:56.497 回答
0

我无法想象为什么有必要拥有一个T***并且我当然无法在没有辅助类的情况下为这样的事情维护资源!如果我不能std::vector<T>用来帮助维护,我将实现一个类似的类(嗯,这对我来说很容易:我已经实现了我自己的 C++ 标准库版本......)。

我没有寻找所有问题,但最直接的问题是您new robots**将结果视为具有超过robots[i].

于 2012-11-17T23:40:01.280 回答