我目前正在编写一个类似于盗贼的代码,并且自然会使用大量的随机数生成。
我遇到的问题是,如果我“过热”rand(),我的程序就会崩溃。
如果我每帧只生成20个左右的整数,这是可以的…但当随机数字的数量达到数百个时,程序就会崩溃。每一帧我产生的越多,它就越快崩溃...这让我相信一定是连环相撞了。
我已经测试过了,在每帧20兰德();调用的情况下,它将以最大速度连续运行24小时而不会崩溃。三倍还不到十分钟。
如果我把srand();放在初始化中,我可以在它锁定之前产生数千个随机数-但是如果我把srand();放在帧本身中,我会使它大约2-8帧。如果这很重要,我将使用time(null)作为种子。
我调用rand()的频率越高,它崩溃的时间就越早。
帮助?
发布于 2011-04-05 07:46:02
以下是一些关于如何缩小问题来源的评论和想法:
srand()
或rand()
函数导致崩溃/锁定。有可能是一个或多个随机数的组合让你的引擎进入了一个坏事情发生的状态。srand(12345)
这样的常量种子,而不是使用srand(NULL)
。根据您的引擎使用的其他因素(如用户输入),这可能足以使它每次在同一地点崩溃。#ifdef
、注释掉代码、设置应用程序选项,甚至创建项目的临时副本,这样您就可以简单地删除代码、编译和测试。这可能是困难的,如果项目是large/complex.发布于 2011-04-05 05:33:19
函数rand()不是可重入的,也不是线程安全的,因为它使用的隐藏状态在每次调用时都会被修改。这可能只是下一次调用要使用的种子值,也可能是更复杂的东西。为了在线程化应用程序中获得可重现的行为,必须显式设置此状态。函数rand_r()提供了一个指向无符号整数的指针,用作状态。这是一个非常小的状态,所以这个函数将是一个弱的伪随机生成器。尝试使用drand48_r(3)。
发布于 2011-04-05 05:55:33
尝试在调试器下运行它
$ gdb myprog
(gdb) break main
(gdb) run
(gdb) record
例如:
(gdb) break abort
(gdb) break exit
因为它是c++:
(gdb) catch throw
(gdb) catch exception
最后(gdb)继续
当它停止时,反向继续,直到你找到罪魁祸首。
选项2:
valgrind --tool=massif --massif-out-file="massif.out.%p" myprog
ms_print massif.out.*
要检查堆分析,请执行以下操作。您不是不可能有内存泄漏
https://stackoverflow.com/questions/5544550
复制相似问题