gpt4 book ai didi

C++:读取数据怎么可能影响内存?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:05 31 4
gpt4 key购买 nike

最近我一直在深入研究 C++,我的错误似乎变得复杂了。

我有一个对象 vector ,每个对象都包含一个 float vector 。我决定我需要创建一个进一步的平面数组,其中包含一个所有对象的所有浮点值。它比那复杂一点,但问题的要点是,当我遍历我的对象以提取浮点值时,在某些时候我的对象 vector 被更改,或者以某种奇怪的方式损坏。 (我的读操作都是const函数)

另一个例子是 MPI。我刚刚开始,所以我只想在两个不同的节点上运行完全相同的代码,它们有自己的内存并且没有发生数据传输,一切都非常简单。令我惊讶的是,我遇到了段错误,经过几个小时的跟踪,我发现一个变量的一次赋值将一个完全不同的变量设置为 NULL。

所以我很好奇,读取操作怎么可能会影响我的数据结构。同样,看似无关的操作如何影响另一个操作。我不能指望这些简短的描述能解决我的问题,但我们将不胜感激任何建议。

更新:这是一段代码,我最初没有发布,因为我不确定在不了解整个系统的情况下可以从中提取多少。

不过,我刚刚发现的一件事是,当我停止将值分配给我的平面数组而只是 cout'ed 时,段错误消失了。所以也许我声明我的数组是错误的,但即使我是错误的,我也不确定它会如何影响对象 vector 。

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

同样,内存应该被隔离,它们应该像彼此一无所知一样工作。但是删除这个条件并使两个循环都执行所有立方体,消除了错误

最佳答案

这不是数组构造函数:

float * flatFitness;
flatFitness = new float(popSize);

您在这里在堆上创建了一个 float ,用值 popSize 初始化。如果你想要一个 float 组,你需要使用方括号而不是圆括号:

float *flatFitness = new float[popSize];

这很容易导致您描述的问题。另外,请记住,当您创建数组时,您需要使用 delete [](最终)进行删除:

delete [] flatFitness;

如果您只是使用delete,它可能会起作用,但行为是未定义的。

如果你想完全避免使用数组语法,为什么不使用 std::vector?您可以像这样创建 popSize 元素的 vector :

#include <vector>

std::vector<float> flatFitness(popSize);

当它超出范围时,它会自动释放,因此您不必担心 newdelete

更新(回复:评论):如果您已经在代码的其他地方使用了 std::vectors,请查看 std::vector::交换()。您可以避免完全复制内容,只需在 CUDA 缓冲和您在此处进行的处理之间来回交换几个 vector 。

关于C++:读取数据怎么可能影响内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/795496/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com