矢量 push_back 随机发生
Posted
技术标签:
【中文标题】矢量 push_back 随机发生【英文标题】:Vector push_back happens randomly 【发布时间】:2012-03-12 10:23:23 【问题描述】:我在尝试在 QT 中实现棋盘游戏时遇到了一个非常奇怪的错误。这是我第二次遇到同样的问题,现在我想是时候在这里问了。
我仍然在游戏的逻辑部分,其中有一个名为 Field 的类和一个名为 Board 的类。 Board 类有一个QVector < Field* > fields
属性,它是Field
指针的向量。这就是问题所在。我有一个函数应该用新字段上传这个向量。这是我的来源,很简单:
void Board::addFields()
for(int i = 0; i<size; i++) //the board's size is size x size
for(int j = 0; j<size; j++)
Field * f = new Field();
fields.push_back(f);
//qDebug()<<i*size+j<<" "<<f;
//qDebug()<<fields.size();
在我遇到大量奇怪的错误之后,我决定将元素的实际数量、实际元素的引用以及两个循环之后向量的大小写入控制台。
结果很奇怪,我没有出错,但有时它会添加我所有的元素,有时它会停在随机数量的元素上,并且向量的大小甚至没有像这样打印出来:
结果 1(正常):
0 0xa173a8
...
24 0x701c18
25
结果 2(???每次都有不同数量的元素):
0 0xa173a8
...
12 0xa17548
//没有向量大小,我假设函数有返回值;因为某事
我用 QVector 和 std::vector 都试过了,都是一样的。请如果有人有任何想法,可能是什么问题,请告诉我!
谢谢,对不起我的英语!
编辑
我所有的代码都在这里:
field.h:http://paste2.org/p/1937231
field.cpp:http://paste2.org/p/1937232
player.h:http://paste2.org/p/1937238
player.cpp:http://paste2.org/p/1937239
board.h:http://paste2.org/p/1937234
board.cpp:http://paste2.org/p/1937235
main.cpp:http://paste2.org/p/1937243
【问题讨论】:
fields
是如何以及在哪里声明的?
fields 在 Board 类中被声明为私有属性。 (私有:QVector 感谢大家的帮助,我找到了解决办法。
因为我正在制作窗口应用程序的逻辑部分,所以我开始了一个 QT gui 项目。它为我生成了一个 main() 函数:
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
我不知道这是什么,但是因为我现在不需要任何窗口,所以我删除了代码,并用我的代码替换它,然后简单地返回 0;在末尾。这一定是导致问题的原因,因为当我再次将 QApplication 添加到代码中时:
QApplication a(argc, argv);
Board b(10);
return a.exec();
它就像一个魅力......
我不知道在这种情况下该怎么办,如果可以的话,我会向所有试图提供帮助的人指出这一点。但无论如何,非常感谢您的帮助! :)
【讨论】:
【参考方案2】:当您键入new Field();
时,您会进行动态内存分配。返回的指针实际上是非常随机的,你不应该依赖它是顺序的。但通常这没问题。
在我遇到很多奇怪的错误之后,我决定将实际元素的数量、实际元素的引用以及两个循环之后向量的大小写入控制台。
您到底遇到了什么错误?
【讨论】:
当我尝试访问向量的元素时出现错误。但是因为它们并不总是被添加,所以会产生错误。现在我不尝试访问元素,所以我没有收到任何错误。【参考方案3】:size
是会员吗?根据我的经验,如果事情是随机发生的,那 98% 是由未初始化的成员引起的..
【讨论】:
你确定Board::Board(int size):size(size)
这件事不会造成问题吗?使用不同的名称进行初始化...
我检查了你的代码,它没有显示问题。我只是以更安全的方式进行了一些初始化,即Board::Board(int size_):size(size_), fields(), playerOne(0),playerTwo(0)
和Field::Field(Player *player_) : player(player_)
【参考方案4】:
我不知道C++中对象初始化的细节,但是
Board::Board(int size):size(size)
playerOne = new Player("Player One");
playerTwo = new Player("Player Two");
newGame(this->size);
可能是问题的原因。事实上,newGame 使用了fields
,它没有被明确地初始化。所以尝试使用
Board::Board(int size):size(size), fields(size*size) //or just fields()
...
告诉我们会发生什么。
【讨论】:
我试过这个: Board::Board(int s):size(s), fields(s*s) ... 还是一样... :(以上是关于矢量 push_back 随机发生的主要内容,如果未能解决你的问题,请参考以下文章