最近做了一个扫雷的游戏,我首先自己写了一个类zButton,这个类派生自QPushButton,这个类被用作显示雷或者数字(就是扫雷游戏的格子)
然后又写了一个Bomber,派生自QDialog,主要用于摆放地雷,还有一些人机对话
在这个Bomber里我要摆放15X15 = 225个地雷,也就是225个zButton,然后我选择用QVector来放这些zButton
在Bomber里我起初用有私有成员
QVector<zButton> buttons; //用于存放225个zButton
但后来编译的时候提示我QPushButton 复制函数是私有的之类的,网友告诉我QPushButton不能直接复制,所以也不能用push_back()函数吧zButton放进去
然后我想,不能存放zButton,那存放(zButton的)指针总可以吧
于是我把Bomber的成员从QVector<zButton>; 改成了QVector<zButton*>;
然后Bomber的构造函数是这样的
QVector<zButton*>::iterator BUTTON = buttons.begin(); //BUTTON为这个指针容器的迭代器 //问题在这里
for(int i = 0 ; i < 225 ; i++)
{
int A = *(pt+i); //这个pt是某个QVector<int>的迭代器,用于存放地雷的类型
*BUTTON = new zButton(A);
BUTTON++;
}
起初我没有注意这个问题,上面这段代码通过编译,然后程序运行也OK,一切正常
ubuntukylin14.04 + g++4.8.2 +Qt5.3.1
生成(linux)程序后,我那程序做了各种测试,功能和我预期的一样,也没出现任何其他问题
然后今天我想把我的代码那到window程序上,qt5.3.1+MingW
结果编译生成exe文件,程序一运行就直接崩溃,
然后我用QT creator进行debug,得到的结果是
“收到系统底层信号导致程序结束”
网友告诉我这可能是程序的内存分配出现严重问题
然后我把上面linux下的代码加了点。。
zButton room(0); //增加的代码
for(int i = 0 ; i < 225 ; i++)
{
buttons.push_back(&room);
}
QVector<zButton*>::iterator BUTTON = buttons.begin(); //BUTTON为这个指针容器的迭代器
for(int i = 0 ; i < 225 ; i++)
{
int A = *(pt+i);
*BUTTON = new zButton(A);
BUTTON++;
}
然后重新编译生成的exe程序就和linux下的一样了。
我想问下,为什么这是平台相关性(应为我自学的,QT还没有看到夸平台移植那部分)还是代码的问题?
为什么window平台就要给这个向量先填满,而linux完全不需要?
应为QVector<zButton*>我创建的是个QVector,并不是动态分配内存。
------解决思路----------------------
1. 你的代码没有语法错误,但是有逻辑错误,所以编译时都没问题,运行时有问题。
2. Linux没有报错,Windows报错不代表逻辑没错,运行时错误与运行的时候内存中的数据有关系,而真好在Windows上碰到了,你可以把这个程序在不同的时间,不同的机器上的Linux跑跑看,说不定什么时候就遇到错误了。
3. iterator是遍历,只有有了数据才能去遍历,你的是还没数据就操作iterator,C++ STL 和 Qt STL都是同样的。
4. 改正:
for(int i = 0 ; i < 225 ; i++) {
int A = *(pt+i);
buttons.append(new zButton(A));
}[/code]