最近我一直在深入研究 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);
当它超出范围时,它会自动释放,因此您不必担心 new 或 delete。
更新(回复:评论):如果您已经在代码的其他地方使用了 std::vectors,请查看 std::vector::交换()。您可以避免完全复制内容,只需在 CUDA 缓冲和您在此处进行的处理之间来回交换几个 vector 。
关于C++:读取数据怎么可能影响内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/795496/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
所以我开始关注ruby,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出
给定以下方法:defsome_method:valueend以下语句按我的预期工作:some_method||:other#=>:valuex=some_method||:other#=>:value但是下面语句的行为让我感到困惑:some_method=some_method||:other#=>:other它按预期创建了一个名为some_method的局部变量,随后对some_method的调用返回该局部变量的值。但为什么它分配:other而不是:value呢?我知道这可能不是一件明智的事情,并且可以看出它可能有多么模棱两可,但我认为应该在考虑作业之前评估作业的右侧...我已经在R