当前位置: 代码迷 >> QT开发 >> linux和window处理内存的有关问题
  详细解决方案

linux和window处理内存的有关问题

热度:109   发布时间:2016-04-25 03:06:01.0
linux和window处理内存的问题
最近做了一个扫雷的游戏,我首先自己写了一个类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]
  相关解决方案