zoukankan      html  css  js  c++  java
  • C++出现terminate called after throwing an instance of 'std::bad_alloc'what(): std::bad_alloc

    代码如下:

    class SpeehManager
    {
    public:
        vector<vector<int>> vec; 
        SpeechManager{
            vector<int> v1;
            vector<int> v2;
            vector<int> v3;
            this->vec.push_back(v1);
            this->vec.push_back(v2);
            this->vec.push_back(v3);    
        }   
        void init()
        {
            //尝试初始化v3容器
            vector<vector<int>>::iterator it = this->vec.end();
            (*it).push_back(1);
            (*it).push_back(2);
            (*it).push_back(3);
            (*it).push_back(4);
            (*it).push_back(5);
        }
    };

    编译出错:

    terminate called after throwing an instance of 'std::bad_alloc'what():  std::bad_alloc

    分析解决:

    【内存不够】:

    1,确认系统已占用内存是否正常,排除数据量过大导致的问题,此时系统内存不足导致 std::bad_alloc

    【内存剩余】:

    1,确认接口调用时,调用和背调接口的的参数是否一致,动态库库调用中若不一致,编译链接通过,但执行可能导致 std::bad_alloc

    2,确认是否使用vector,vector超容量时会重新申请二倍内存,因为vector会将老的一块内存,完全拷贝到另一块连续容量为2倍的vector内存中,高峰时内存将时当前系统的3倍,此时可能导致 std::bad_alloc

    仔细看了下写的代码,想到一个知识点:vector容器的end指向的并不是容器中最后一个元素,而是最后一个元素的下一个元素地址,所以访问了非法内存,故这里的解决方法是:如果要访问容器中最后一个元素,需要将迭代器--,即it--。

    参考链接:https://blog.csdn.net/wuhenlegou110/article/details/86743672

  • 相关阅读:
    WPF/Sliverlight ScrollViewer与Panel(2)
    OpenGL学习笔记(7)多边形绘制
    OpenGL学习笔记(10)抗锯齿
    OpenGL学习笔记(9)颜色混合
    GLUT函数说明(转)
    OpenGL学习笔记(8)显示列表
    C#操作IIS的代码
    完整解决Flash载入中文FLASH乱码问题
    用C#的IIS上配置用户账号
    ASP.NET定时调用WebService 运行后台代码
  • 原文地址:https://www.cnblogs.com/BASE64/p/14349333.html
Copyright © 2011-2022 走看看