c++ - 基于 SDL 的汉诺塔游戏中的奇怪问题

标签 c++ class infinite-loop

我想创建一个基于 SDL 的 Hanoi Tower 游戏,但在我继续编写“引擎”之前,我想在控制台中测试我的 Hanoi。出乎意料的是,它竟然有很多问题。

CTower tower[3];

tower[0] = CTower(3);
tower[1] = CTower(3);
tower[2] = CTower(3);

init(&tower[0]);  //prepare first tower
tower[0].Print();

这段代码应该创建 3 个数组(大小为 3)并用 0(零)填充它们。然后,在 init() 中,我准备了第一个塔(用 vaild 圆盘填充它)。不管看起来多么简单,我的应用程序在打印时停止并且没有填充剩余的数组(0)。奇怪的是,函数 init() 工作得很好。

如果有任何帮助,我将不胜感激。

这里有一些要检查的代码:

class CTower {
    uint16 *floors, floorsNum;

    void Init();

  public:
    (...) //definitions, probably of zero importance
};

void CTower::Init() {
  //private member, filling with zeros
  for (uint16 i = 0; i < floorsNum; i++)
    floors[i] = 0;
}
CTower::CTower() {
  //default initialiazer
  floors = NULL;
  floorsNum = 0;
}
CTower::CTower(uint16 nfloors) {
  floors = new uint16[nfloors];
  floorsNum = nfloors;
  this->Init();
}
CTower::~CTower() {
  delete[] floors;
  floorsNum = 0;
}
void CTower::Print() {
  if (floorsNum == 0) printf("EMPTY TOWER!");
  else
    for (uint16 i = 0; i < floorsNum; i++)
      printf("%d\n", floors[i]);
}
void init(CTower *tower) {
  //a friend method of CTower
  for (uint16 i = 0; i < tower->floorsNum; i++)
    tower->floors[i] = i+1;
}

我的申请来源:https://rapidshare.com/files/2229751163/hanoi-tower.7z

最佳答案

问题出在您的初始化和您的类(class)分配上。看来你忘记了 Resource Acquisition is Initialisation . 您面临免费损坏:您在未分配的属性上调用 delete[]

你有这个构造函数:

CTower::CTower() {
//default initialiazer
floors = NULL;
floorsNum = 0;
}

NOT 分配内存但被销毁:

CTower::~CTower() {
  delete[] floors;
  floorsNum = 0;
}

修复程序的一个简单方法是直接使用工作构造函数进行分配:

int main(void) {
  CTower tower[3] = { CTower(3), CTower(3), CTower(3) };

  init(&tower[0]);
  tower[0].Print();
  printf("\n");
  tower[1].Print();

  return 0;
}

但是 还要修复您的 Class,无论是在 Destructor 还是 Constructor 部分。

关于c++ - 基于 SDL 的汉诺塔游戏中的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9224506/

相关文章:

c++ - 如何在 VCL 应用程序中处理已发布、已注册的 Windows 消息?

c++ - 如何将带有特殊字符的QString转换成字节流通过Linux管道发送

java - 如何使用Scanner处理由无效输入(InputMismatchException)引起的无限循环

c - 为什么 "for(;;)"的测试条件成功?

c++ - "myType& var = *(myType*) addrVar;"的逆运算是什么(c++)

c++ - 将 const double[][] 数组作为参数传递给 double** 接口(interface)

java - 第一次请求的 servlet 响应时间很慢

C# (mono) 没有利用所有内核

c++ - C++ 中包含子类的基本抽象类数组

c++ - 当对象陷入无限循环时被销毁会发生什么?