不使用新的C++内存分配错误

标签 c++ bad-alloc

我的程序遇到了引发大量内存分配异常的问题,并且我很难诊断该问题...我会发布代码,但是我的程序很大,并且我有专有的信息问题,所以我希望在不发布代码的情况下获得帮助。如果您打算以某种形式的SSCCE评论进行回复,请立即停止阅读并为我们俩节省一些时间。在这种情况下,我无法发布简洁的代码-我将在问题描述和某些特定问题上尽量保持简洁明了。

程序背景-我的程序基本上是一个数据处理程序。它以一堆数据表作为输入,对其进行计算,然后根据计算结果吐出新的数据表。我所有的数据结构都是用户定义的类(由带有数组的 vector 容器的int,double和string类型组成)。在所有情况下,我都在不使用new和delete的情况下初始化类变量的实例。

问题描述-我的程序编译时没有警告,并且可以在较小的数据集上正常运行。但是,一旦我增加了数据集(从20x80数组增加到400x80),我就开始抛出bad_alloc异常(一旦我处理了前35个条目左右)。大型数据集在我的18个模块中的17个中运行良好-我隔离了其中一个发生错误的函数。该函数所需的计算将导致创建约30,000行数据,而我的代码中的其他函数将生成800,000多行而不会发生意外。
该模块中唯一真正的唯一属性是我正在使用大量调整大小(每个函数调用大约100次),并且该函数在调整大小操作期间使用了递归循环(该函数在1个建筑物的租户中分配平方英尺)时间,然后在模拟每个租户租约的大小和持续时间之后,更新剩余的脚来分配,直到分配了所有平方英尺为止)。而且,每次错误都发生在几乎相同的位置(但不是完全相同的位置,因为我有一个随机数生成器,会导致结果有所不同)。真正令我感到困惑的是,对该函数的第一个〜34调用可以正常工作,〜35调用不需要比前一个34占用更多的内存,但是我在第35个调用上仍存在这些bad_alloc异常...

我知道没有代码很难提供帮助。请尝试给我一些方向。我的具体问题如下:

  • 如果我不使用“new”和“delete”,并且所有变量都在本地函数的内部初始化,是否可能通过重复的函数调用而出现内存泄漏/分配问题?使用“vector 实例”初始化局部函数的变量包括时,我有什么能做或应该做的事情来管理内存?声明我的变量?
  • 如果我要通过堆栈执行整个程序,是否有可能我的堆栈内存不足?是否有可能需要在堆上加载一些大的查询表(映射等),然后将堆栈用于速度很重要的迭代中?
  • 使用与内存相关的调整大小是否存在问题?难道这是我应该使用“new”和“delete”的实例(在很多情况下,我被警告不要使用它们,除非有非常明确的特定理由要这样做)?
  • [涉及3]在问题函数中,我正在创建一个类变量,然后将该变量写入大约20次(每次对模型的“迭代”一次)。执行此操作时,我不需要上一次迭代的数据...因此,表面上可以为每次迭代创建变量的新实例,但是我不知道这将如何一定有帮助(因为显然我能够在第一个〜34个数据切片上的一个实例上完成所有20次迭代)

  • 任何想法将不胜感激。我可以尝试发布一些代码,但是我已经尝试过一次,并且每个人似乎都因为它不可编译而分心。我可以发布有问题的函数,但它不会自行编译。

    这是导致问题的类:
    // Class definition
    class SpaceBlockRentRoll
    {
    public:
        double RBA;
        string Tenant;
        int TenantNumber;
        double DefaultTenantPD;
        int StartMonth;
        int EndMonth;
        int RentPSF;
        vector<double> OccupancyVector;
        vector<double> RentVector;
    };
    
    // Class variable declaration (occuring inside function)
    vector<SpaceBlockRentRoll> RentRoll;
    

    另外,这是递归发生的函数的摘录
    for (int s=1; s<=NumofPaths; ++s) {
        TenantCounter = 0;
        RemainingTenantSF = t1SF;
        if (RemainingTenantSF > 0) {
            while (RemainingTenantSF > 0) {
                TenantCounter = TenantCounter + 1;
    
                // Resize relevant RentRoll vectors
                ResizeRentRoll(TenantCounter, NumofPaths, NumofPeriods, RentRoll);
    
                // Assign values for current tenant
                RentRoll[TenantCounter] = AssignRentRollValues(MP, RR)  
                // Update the square feet yet to be allocated
                RemainingTenantSF = RemainingTenantSF - RentRoll[TenantCounter].RBA;
            }
        }
    }
    

    最佳答案

    bad_alloc来自某种形式的堆问题,并且可以由任何间接分配或释放堆内存的代码抛出,其中包括所有标准库集合(std::vectorstd::map等)以及std::string

    如果您的程序不使用大量堆内存(因此它们没有用完堆),则bad_alloc可能是由堆损坏引起的,这通常是由于在堆中使用了悬空指针造成的。

    您提到您的代码执行了许多resize操作-大多数集合上的resize将使集合上的所有迭代器无效,因此,如果在resize之后重用任何迭代器,则可能会导致堆损坏,从而导致bad_alloc异常。如果您使用未经检查的 vector 元素访问(std::vector::operator[]),并且索引超出范围,则也可能导致堆损坏。

    通常,跟踪堆损坏和内存错误的最佳方法是使用堆调试器,例如valgrind

    关于不使用新的C++内存分配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17958352/

    相关文章:

    c++ - Win32 上的内存不足 (?) 问题(与 Linux 相比)

    xorg - IntelSandyBridge 上的 "X Error"BadAlloc GLX BadContext(Intel HD Graphics 3000)

    在构造函数中抛出 C++ bad_alloc

    c++ - Qt : restarting thread

    c++ - 如何在从 Linux 移植的 C++ 项目中使用 Open GL

    c++ - 启用 MSAA 时,会出现伪影并且边缘上的纹理查找失败

    c++ - std::bad_alloc 运行时异常

    c++ - 从另一个基本方法调用重写的方法

    c++ - 仍然无法初始化 .h 文件中的私有(private)静态字段?

    c++ - 如果内存不足抛出 Bad_alloc 异常