Search code examples
c++qtmemorytry-catchalloc

why double free or corruption?


Every 1 second, function works. my system the linux. Runs suddenly dies.

-----global-------

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

When memory allocation fails, the exception handling. However, the program will die. I made a mistake? output:

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


Solution

  • Preface. It is strongly recommended to avoid raw pointers, like

    unsigned short int** US_INT
    

    Either use vector of vectors, or single-dimension vector and access elements like vec.at(X + Y*sizeX);

    Why program dies?

    Exception probably thrown in a middle of allocation of US_INT elements, so, part of array is valid, and part of array is uninitialized garbage. And in CATCH you are deleting pointers in whole array. Since deleting uninitialized pointer is undefined behavior - this is one of possible outcomes of UB here.