bigbadpiano
bigbadpiano

Reputation: 69

Incorrect checksum for freed object - error when printing

I have made a class that's supposed to make a symmetric toeplitz matrix (see here). The implementation of the class is shown here

class toeplitz{
private:
    int size;
    double* matrix;
public:
    toeplitz(const double* array, const int dim){
         size = dim;
         matrix = new double(size*size);
         for(int i = 0; i < size; i++){
             for (int j = 0; j < size; j++){
                 int index = std::abs(i - j);
                 matrix[i*size + j] = array[index];
             }
         }
    }

    ~toeplitz(){
        delete[] matrix;
    }

    void print() const{
        //loop over rows
        for (int i = 0; i < size; i++){
            //loop over colums
            for (int j = 0; j < size; j++){
                double out = matrix[i*size + j];
                std::cout << std::setw(4) << out;
            }
        //start new line for each row
        std::cout << "\n";
        }
    }

};

I can't see what's wrong with this, but when I try and use this in a simple test function, I get malloc errors. The main function I have is

int main(){
    double array[] = {0,1,1,2};
    int len = sizeof(array)/sizeof(array[0]);
    std::cout<<"length of array " << len << std::endl;
    toeplitz tp = toeplitz(array, len);
    tp.print();
}

It compiles and runs when I leave out the tp.print() line, but when I add this line I get error

test_toeplitz(8747,0x7fffdbee63c0) malloc: *** error for object 0x7fb119402788: 
incorrect checksum for 
freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

I cannot figure out why this is. I've looked at the other questions about this on here but I can't tell how they relate to what I've done. As I understand it has to do with either double freeing memory or trying to modify memory after it's been freed, but I can't see where my code is doing that. Any insight into what's going on would be appreciated.

Upvotes: 1

Views: 1354

Answers (1)

Jean-Fran&#231;ois Fabre
Jean-Fran&#231;ois Fabre

Reputation: 140256

You stumbled on the classical:

matrix = new double(size*size);

which allocates a double worth size*size when you wanted to do:

matrix = new double[size*size];

to allocate an array of the proper size. So you get undefined behaviour. Sometimes it works sometimes not depending on the memory configuration.

Since you're using C++, I suggest you use std::vector<double> or Eigen matrix template, and drop C arrays forever (no more memory leaks, no more failed allocations, possible boundary checking, only advantages)

Upvotes: 3

Related Questions