为什么双重自由或腐败?

why double free or corruption?

每 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;
            }
}

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

Error in `./TEST': double free or corruption (out): 0x34b00418

您的 catch 子句已损坏。您从 delete[] US_INT[i] 开始,如果第一个 new 导致异常,则它无效。修复:使用 std::vector<>。没有合理的方法来找出 257 个分配中的哪一个被抛出,因此您不知道要撤消什么。

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

unsigned short int** US_INT

要么使用向量中的向量,要么使用 single-dimension 向量并访问 vec.at(X + Y*sizeX);

这样的元素

为什么程序会死掉?

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

我可以像其他人一样推荐,使用std::vector<>!!!您将在几行人人都可以阅读的代码中实现相同的目标。

cnt=cnt+(256/255);

好吧 256/255 等于 1 所以你可以把它改写成 ++cnt;