linux和window处理内存的问题

王大贵 2014-12-07 12:43:10
最近做了一个扫雷的游戏,我首先自己写了一个类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,并不是动态分配内存。
...全文
276 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Inhibitory 2014-12-07
  • 打赏
  • 举报
回复
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]

16,211

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧