我想创建一个基于 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/