题
我已经深入到C ++最近,我的错误似乎变得复杂。
我有对象的矢量,每个对象都包含漂浮的向量。我决定我需要创建包含一个所有对象的所有浮点值的另一扁平阵列。这是比这要复杂一些,但问题的要点是,因为我遍历我的对象在某个点提取浮点值,我的对象的矢量改变,或以某种奇特的方式损坏。 (我的读操作是所有const函数)
另一个例子是与MPI。我刚刚起步,所以我只是想用自己的记忆,并没有数据传输发生运行在两个不同的节点完全相同的代码,一切都很简单。令我惊讶我得到分割误差和跟踪小时后,我发现一个变量的一个分配被设置完全不同的变量设置为NULL。
所以我很好奇,怎么可能读操作会影响我的数据结构。同样怎能一个看似无关的操作影响到另一个。我不能指望我的问题的解决方案与简单描述,但任何意见,将不胜感激。
更新: 下面的代码的片段,我没有原来职位,因为我不知道有多少可以从中抽出,而没有理解整个系统。
一两件事,我才发现,虽然是,当我停下来分配值到我的平板阵列,只是cout'ed相反,赛格错误消失。因此,也许我声明我的数组错的,但我就算是我不知道它将如何影响对象矢量。
void xlMasterSlaveGpuEA::FillFlatGenes() {
int stringLength = pop->GetGenome(0).GetLength();
for (int i=0;i<pop->GetPopSize();i++)
for (int j=0;j<stringLength;j++)
flatGenes[(i*stringLength)+j]<< pop->GetGenome(i).GetFloatGene(j);
}
float xlVectorGenome::GetFloatGene(unsigned int i) const {
return GetGene(i);
}
我的平面阵列是一个成员函数
float * flatFitness;
initailsed在构造像这样:
flatFitness = new float(popSize);
更新2:
我只是想指出的是,上面的两个例子是不相关的,第一个是未多线程。第二MPI例子是技术上的,但MPI分布内存和我特意尝试最简单的实现我能想到的,它是独立运行的代码两台机器。然而,有一个额外的细节,我把一个condtional说
if node 1 then do bottom half of loop
if node 1 then do top half
同样的内存应该被孤立的,它们应该是工作,就好像他们一无所知对方..但除去该条件,使这两个循环做所有多维数据集,消除错误
解决方案
这不是一个数组构造:
float * flatFitness;
flatFitness = new float(popSize);
您正在创建一个浮在这里堆,用价值popSize
初始化。如果你想float数组,你需要改用括号括号:
float *flatFitness = new float[popSize];
这很容易会导致您所描述的问题。此外,请记住,当你创建数组,你需要使用delete []
删除(最终):
delete [] flatFitness;
如果你只是用delete
,它可能工作,但行为是不确定的。
如果你想避免使用数组语法完全,为什么不使用std::vector
?可以创建popSize元件这样的一个矢量:
#include <vector>
std::vector<float> flatFitness(popSize);
当它超出范围,所以你不必担心new
或delete
这将被自动释放。
更新(重新:评论)::如果你已经在你的代码中使用的其他地方std::vectors
,看看std::vector::swap()
。您可能能够避免复制的东西干脆只是交换了几个向量来回缓冲对CUDA和你在这里做处理之间。
其他提示
我怀疑你具有多线程或内存损坏问题你不知道的。您所描述的行为不是任何类型的标准,通过设计,期望的行为。
jeffamaphone可能是正确的,这是一个线程问题。另一种可能是,你正在阅读的对象已被删除。你将被从无效地址读取。这也有可能是你写到此时的数据结构存储在该向量以前住在同一位置。这将导致您所描述的行为。
修改强>(基于您的更新):
这可能出现故障:stringLength
在外循环之外初始化,但看起来它需要一个外循环期间被更新:
int stringLength = pop->GetGenome(0).GetLength();
for (int i=0;i<pop->GetPopSize();i++)
for (int j=0;j<stringLength;j++)
flatGenes[(i*stringLength)+j]<< pop->GetGenome(i).GetFloatGene(j);
建议的修复:
for (int i=0;i<pop->GetPopSize();i++) {
int stringLength = pop->GetGenome(i).GetLength();
for (int j=0;j<stringLength;j++) {
flatGenes[(i*stringLength)+j]<< pop->GetGenome(i).GetFloatGene(j);
}
}