矢量 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 字段;) 你能发布更多代码吗?您遇到了哪些奇怪的错误,它们在哪里? 问题很可能出在其他地方 我现在已经在 64 位和 32 位的 Ubuntu 11.10 上测试了您的代码。我看不到任何应该导致这种情况的东西。然而,我注意到您发布的代码不会按原样编译(缺少标头),因此您似乎 可能 有一个受污染的构建环境。我用 qmake 为你构建了一个干净的构建,rapidshare.com/files/3141791124/game.tar.gz。你应该可以只下载这个,然后“qmake && make”。看看它是否有效。否则,我最好的选择是您使用的是损坏的库或损坏的编译器。 【参考方案1】:

感谢大家的帮助,我找到了解决办法。

因为我正在制作窗口应用程序的逻辑部分,所以我开始了一个 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 随机发生的主要内容,如果未能解决你的问题,请参考以下文章

显然是随机矢量绘图:TSNE

自动矢量化随机播放指令

矢量化代码中随机减速的原因

CWE-329: 密码分组链接模式未使用随机初始化矢量

c++中向量中的随机访问[重复]

用于矢量化的随机读取上的结构阵列 (AoS) 与阵列结构 (SoA)