为什么双重自由或腐败

why double free or corruption?

本文关键字:自由 为什么      更新时间:2023-10-16

每 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"中的错误:双重释放或损坏(输出):0x34b00418

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

unsigned short int** US_INT
要么使用向量的向量,

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

为什么程序会死?

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

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

我可以推荐与其他人相同的,请使用std::vector<> !!!您将在每个人都可以阅读的几行代码上实现相同的结果。

cnt=cnt+(256/255);

好吧256/255等于1,因此您可以将其重写为++cnt;