我在使用C ++应用程序时遇到运行时内存分配错误。我已经消除了内存泄漏,无效指针引用和越界向量分配作为问题的根源 - 我很确定它与内存碎片有关,我希望得到如何进一步诊断和纠正问题
我的代码太大而无法发布(大约15,000行 - 我知道不是很大但显然太大而无法上线),因此我将使用一些相关的代码片段来描述事物。
基本上,我的程序将一堆字符串和数值数据集作为输入(类型为double,string,int和bool的矢量变量的对象),执行一系列计算,然后吐出结果数字。我已经测试并重新测试了计算和输出 - 一切都按计算进行计算,而在较小的数据集上,事情运行得非常完美。
然而,当我扩展时,我开始得到内存分配错误,但我认为我甚至接近我的系统的内存限制 - 请看下面的两个图...我的程序循环一系列场景(在每个场景的不同参数集下执行相同的计算) - 在第一个图中,我在大约200个条目的数据集上运行7个场景。如图所示,每个“周期”导致内存向上和向下回到其基线,并且整体内存使用量很小(参见底部图形右半部分的七个小点)。在第二张图上,我现在运行的数据集大约有10,000个条目(请参阅下面有关数据集的说明)。在这种情况下,我只能在得到错误之前经历2个完整周期(因为它试图为第三个场景调整类对象的大小)。您可以在右下半部分图中看到前两个场景;比以前更多的内存使用量,但仍然只是可用内存的一小部分。与较小的数据集一样,在我的场景运行时,使用率会增加,然后在到达下一个场景之前降低到初始值。
这种模式,以及我所做的其他测试,让我相信它是某种碎片问题。当我尝试调整矢量大小时,总是会发生错误,尽管导致错误的特定调整大小操作会因数据集大小而异。任何人都可以帮助我了解这里发生了什么,以及我如何解决它?我可以更详细地描述事情,但已经觉得我的帖子变得越来越长......如果需要,请提出问题,我会及时回复/编辑。
澄清数据集 数字200和10,000表示我正在分析的唯一记录的数量。每条记录包含75到200个元素/变量,其中许多都在被操纵。此外,每个变量随着时间的推移和多次迭代(两个维度变量)被操纵。因此,对于平均“记录”(上面提到的200到10,000),可能很容易有多达200,000个与之关联的值 - 样本计算:
1记录* 75变量* 150个周期* 20个迭代=每个记录225,000个唯一值。
违规代码(在此特定情况下):
vector<LoanOverrides> LO;
LO.resize(NumOverrides + 1); // Error is occuring here. I am certain that NumOverrides is a valid numerical entry = 2985
// Sample class definition
class LoanOverrides {
public:
string IntexDealName;
string LoanID;
string UniqueID;
string PrepayRate;
string PrepayUnits;
double DefaultRate;
string DefaultUnits;
double SeverityRate;
string SeverityUnits;
double DefaultAdvP;
double DefaultAdvI;
double RecoveryLag;
string RateModRate;
string RateModUnits;
string BalanceForgivenessRate;
string BalanceForgivenessRateUnits;
string ForbearanceRate;
string ForbearanceRateUnits;
double ForbearanceRecoveryRate;
string ForbearanceRecoveryUnits;
double BalloonExtension;
double ExtendPctOfPrincipal;
double CouponStepUp;
};
答案 0 :(得分:3)
您有一个能够分配大量内存的64位操作系统,但已将您的应用程序构建为32位应用程序,该应用程序最多只能分配大约3GB的内存。你试图分配更多。
如果不了解您的应用程序,就不可能提供更好的建议。但基本上你的内存不足是因为你分配了大量的内存,而且根据你的应用程序和你发布的片段,我认为你可以避免这样做,只需要一点点思考。祝你好运。