我最近一直在深入研究 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;
在构造函数中初始化,如下所示:
flatFitness = new float(popSize);
更新 2:
我只想指出,上面的两个例子没有关系,第一个不是多线程的。第二个 MPI 示例在技术上,但 MPI 是分布式内存,我特意尝试了我能想到的最简单的实现,即两台机器独立运行代码。然而,还有一个额外的细节,我放了一个有条件的说法
if node 1 then do bottom half of loop
if node 1 then do top half
再次,内存应该被隔离,它们应该像彼此一无所知一样工作..但是删除这个条件并使两个循环都执行所有立方体,消除了错误