- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在我的程序中,我正在复制 vector<vector<int> >
对另一个这样的:
#include <vector>
#include <cstdlib>
#include <cmath>
typedef std::vector<std::vector<int> > VVector;
VVector mix_genome(VVector mix_genome,
VVector g1,
VVector g2,
int gene_length)
{
VVector gbuilt = g1; // valgrind gets angry at this a bit...
for(int i = 0; i < 30; i++)
{
int syngamete_chance = std::floor(std::rand() % 100);
if(syngamete_chance <= 50)
{
gbuilt[i] = g2[i];
}
}
int mutation_chance = floor(rand() % 100);
if(mutation_chance <= 3)
{
int gene_num = floor(rand() % 30);
int act_num = floor(rand() % gene_length+1);
int rand_act = floor(rand() % 8);
gbuilt[gene_num][act_num] = rand_act;
}
return gbuilt;
}
在运行程序(每隔一段时间调用此函数)大约 3 分钟后,会导致内存访问错误。 Valgrind 为我提供了有关此功能的以下信息:==31557== Invalid write of size 4
和 Address 0x10207e360 is 0 bytes after a block of size 16 alloc'd
如果我禁用该函数并且不调用它,程序似乎不会崩溃。 GDB 给我 malloc: *** error for object 0x1068a6878: incorrect checksum for freed object - object was probably modified after being freed.
.回溯显示它来自 operator=:
#13 0x000000010000f8d4 in std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >::operator= (this=0x7fff5fbfe780, __x=@0x7fff5fbfeb50) at vector.tcc:140
我认为这也会导致其他错误,但我不确定。
编辑:
这是我的 Tick()
显然也是导致此错误的函数。
int Creature::Tick() {
if(!dead) {
food--;
timeLasted++;
step++;
if(step > maxStep) {
step = 0;
}
if(cooldown > 0) {
cooldown--;
}
if(xpos > 178) {
events[EVENT_RIGHT_SEEN_EDGE_OF_SCREEN] = true;
}
else if(xpos < 20) {
events[EVENT_LEFT_SEEN_EDGE_OF_SCREEN] = true;
}
if(ypos > 179) {
events[EVENT_BOTTOM_SEEN_EDGE_OF_SCREEN] = true;
}
else if(ypos < 20) {
events[EVENT_TOP_SEEN_EDGE_OF_SCREEN] = true;
}
events[EVENT_NOTHING_HAPPENED] = true;
for(int z = 0; z < NUM_EVENTS-1; z++) {
if(events[z]) {
events[EVENT_NOTHING_HAPPENED] = false; // events[z] is true so something happened
}
}
for(int i = 0; i < NUM_EVENTS-1; i++) { // last event should always be "nothing happened"
if(events[i]) {
Action(genome[i][step]); // this has been ided by valgrind: invalid read size 4
events[i] = false;
}
}
if(!fighting && events[EVENT_NOTHING_HAPPENED]) {
Action(genome[EVENT_NOTHING_HAPPENED][step]);
}
if(food < 0)
food = 0;
if(food > maxFood)
food = maxFood;
if(food == 0) {
lifetime -= 5;
}
if(xpos > 200-bodySize) {
xpos = 200-bodySize;
}
else if(xpos < 0) {
xpos = 0;
}
if(ypos > 200-bodySize) {
ypos = 200-bodySize;
}
else if(ypos < 0) {
ypos = 0;
}
}
return timeLasted;
最佳答案
实际上这个可能是问题所在:
int act_num = floor(rand() % gene_length+1);
你是说
int act_num = rand() % (gene_length+1);
?
这大致符合 valgrind 的最后提示:在 ~(207-188) == ~+19 行无效写入 mix_genome
。
这里是相关的部分:
==31557== Invalid write of size 4
==31557== at 0x100001C43: mix_genome(...) (Game.h:207)
...
==31557== Address 0x10207e360 is 0 bytes after a block of size 16 alloc'd
==31557== by 0x10000CB10: std::vector<...>::vector(std::vector<...> const&) (stl_vector.h:233)
==31557== by 0x100001AD3: mix_genome(std::vector<...>, ...) (Game.h:188)
旧答案文本
虽然目前还不知道这是否仍然相关,但最初的分析还展示了如何“读取”valgrind 诊断的其他方法:
您的问题不在于 vector 。看起来您有一个过时的引用(可能是线程错误)。
FPS: 0 # of Creatures: 414 # of Food: 348 ==31557== Invalid read of size 4
==31557== at 0x1000016BC: Creature::Tick() (Creature.h:204)
这告诉我,在 Tick()
中,您正在更新某种统计数据(包括打印在控制台上的 FPS?)。显然,这是指一个地址:
==31557== Address 0x100095980 is 0 bytes after a block of size 16 alloc'd
==31557== at 0xC658: malloc (vg_replace_malloc.c:295)
...
(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&) (stl_vector.h:233)
==31557== by 0x10000CCA2: Creature::Creature(Creature const&) (Creature.h:52)
因此,它可能包含对已释放/重新分配的内容的引用。
请注意,当 vector 调整大小时,它们会使所有现有的引用、指针和/或迭代器失效。为了避免这种情况,
vector::reserve
可用于避免必须根据预期增长进行重新分配boost::stable_vector
编辑 事实上,mix_genome
似乎也写入了无效地址。阅读更多您的 valgrind 日志。
关于c++ - 在 C++ 中复制 vector 时 vector 运算符 = 出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20927942/
我正在使用 node.js 和 mocha 单元测试,并且希望能够通过 npm 运行测试命令。当我在测试文件夹中运行 Mocha 测试时,测试运行成功。但是,当我运行 npm test 时,测试给出了
我的文本区域中有这些标签 ..... 我正在尝试使用 replaceAll() String 方法替换它们 text.replaceAll("", ""); text.replaceAll("", "
早上好,我是 ZXing 的新手,当我运行我的应用程序时出现以下错误: 异常Ljava/lang/NoClassDefFoundError;初始化 ICOM/google/zxing/client/a
我正在制作一些哈希函数。 它的源代码是... #include #include #include int m_hash(char *input, size_t in_length, char
我正在尝试使用 Spritekit 在 Swift 中编写游戏。目的是带着他的角色迎面而来的矩形逃跑。现在我在 SKPhysicsContactDelegate (didBegin ()) 方法中犯了
我正在尝试创建一个用于导入 CSV 文件的按钮,但出现此错误: actionPerformed(java.awt.event.ActionEvent) in cannot implement
请看下面的代码 public List getNames() { List names = new ArrayList(); try { createConnection(); Sta
我正在尝试添加一个事件以在“dealsArchive”表中创建一个条目,然后从“deals”表中删除该条目。它需要在特定时间执行。 这是我正在尝试使用的: DELIMITER $$ CREATE EV
我试图将两个存储过程的表结果存储到 phpmyadmin 例程窗口中的单个表中,这给了我 mariadb 语法错误。单独调用存储过程给出了结果。 存储过程代码 BEGIN CREATE TABLE t
我想在 videoview 中加载视频之前有一个进度条。但是我收到以下错误。我还添加了所有必要的导入。 我在 ANDROID 中使用 AIDE 这是我的代码 public class MainActi
我已经使用了 AsyncTask,但我不明白为什么在我的设备 (OS 4.0) 上测试时仍然出现错误。我的 apk 构建于 2.3.3 中。我想我把代码弄错了,但我不知道我的错误在哪里。任何人都请帮助
我在测试 friend 网站的安全性时,通过在 URL 末尾添加 ' 发现了 SQL 注入(inject)漏洞该网站是用zend框架构建的我遇到的问题是 MySQL -- 中的注释语法不起作用,因此页
我正在尝试使用堆栈溢出答案之一的交互式信息窗口。 链接如下: interactive infowindow 但是我在代码中使用 getMap() 时遇到错误。虽然我尝试使用 getMapAsync 但
当我编译以下代码时出现错误: The method addMouseListener(Player) is undefined for the type Player 代码: import java.
我是 Android 开发的初学者。我正在开发一个接收 MySql 数据然后将其保存在 SQLite 中的应用程序。 我将 Json 用于同步状态,以便我可以将未同步数据的数量显示为要同步的待处理数据
(这里是Hello world级别的自动化测试人员) 我正在尝试下载一个文件并将其重命名以便于查找。我收到一个错误....这是代码 @Test public void allDownload(
我只是在写另一个程序。并使用: while (cin) words.push_back(s); words是string的vector,s是string。 我的 RAM 使用量在 4 或 5
我是 AngularJS 的新手,我遇到了一个问题。我有一个带有提交按钮的页面,当我单击提交模式时必须打开并且来自 URL 的数据必须存在于模式中。现在,模式打开但它是空的并且没有从 URL 获取数据
我正在尝试读取一个文件(它可以包含任意数量的随机数字,但不会超过 500 个)并将其放入一个数组中。 稍后我将需要使用数组来做很多事情。 但到目前为止,这一小段代码给了我 no match for o
有些人在使用 make 命令进行编译时遇到了问题,所以我想我应该在这里尝试一下,我已经在以下操作系统的 ubuntu 32 位和挤压 64 位上尝试过 我克隆了 git 项目 https://gith
我是一名优秀的程序员,十分优秀!