为什么双重免费或腐败?

时间:2016-01-28 07:36:00

标签: c++ qt memory try-catch alloc

每1秒,功能起作用。 我的系统是linux。奔跑突然死了。

----- -------全球

static int arrayNum[33000];

-------------------

 function(){
        unsigned short int**  US_INT;
try{
        US_INT= new unsigned short int*[255];
                for(int i = 0; i < 255; i++)
                {
                    US_INT[i] = new unsigned short int[128];
                    memset(US_INT[i], 0, sizeof(unsigned short int) * 128);
                }
        double x;
        double y;
        int cnt= 0;  
                int nArrayCount=0;
              for(int i = 0; i < 255; i++)
                {

                    for(int j=0;j<128;j++){

                        x=j;
        y=cnt
                        arrayNum[nArrayCount]=US_INT[i][j];

                        nArrayCount++;

                    }
                    cnt=cnt+(256/255); 

                }


         for(int i = 0; i < 255; i++)
                {
                    delete[] US_INT[i];
                }

                delete[] US_INT;
    }
catch (const std::bad_alloc&) {
            qDebug() << "alloc error";
            for(int i = 0; i < 255; i++)
                {
                    delete[] US_INT[i];
                }

                delete[] US_INT;
            }
}

当内存分配失败时,异常处理。但是,程序将会死亡。 我犯了一个错误? 输出:

  

`.TEST&#39;:双重免费或损坏(输出)错误:0x34b00418

3 个答案:

答案 0 :(得分:3)

序。强烈建议避免使用原始指针,例如

unsigned short int** US_INT

使用矢量矢量,或单维矢量和访问元素,如vec.at(X + Y * sizeX);

为什么程序会死?

异常可能在US_INT元素的分配中间抛出,因此,数组的一部分是有效的,并且数组的一部分是未初始化的垃圾。在CATCH中,您将删除整个数组中的指针。由于删除未初始化的指针是未定义的行为 - 这是UB可能的结果之一。

答案 1 :(得分:0)

您的catch条款已损坏。如果第一个delete[] US_INT[i]导致异常,则从new开始,这不是有效的。修复:使用std::vector<>。没有合理的方法来确定257个分配中的哪一个,因此你不知道要撤消什么。

答案 2 :(得分:0)

我可以推荐与其他人一样,使用<li class="p"> !您将在几行代码中实现相同的目标,每个人都可以阅读。

  

CNT = CNT +(255分之256);

std::vector<>等于256/255,因此您可以将其重写为1