Mismatch delete

22,421

Solution 1

The first sample is almost correct. You're deleting each element in a for loop, but then you attempt to delete the array.

for(unsigned i=0;i<len;i++) { delete db[i]; }
delete db;

It should instead be:

for(unsigned i=0;i<len;i++) { delete db[i]; }
delete[] db;

Whenever you use new ...[], you should be using delete[].

Also, don't forget the Rule of Three (or Five (or Zero)).

Solution 2

You are using the wrong delete. Do this:

CCompanyIndex::~CCompanyIndex()
{
    for(unsigned i=0; i<len;i++) delete db[i];
    delete [] db;
}

Note the delete [] call.

Solution 3

You need delete db[i] for each element but delete[] db for the array itself, so neither destructor was correct.

Arrays allocated with new Foo[n] must be deallocated with the array form, delete[], that's what valgrind means about mismatch new/delete

Share:
22,421
user1890078
Author by

user1890078

Updated on July 21, 2022

Comments

  • user1890078
    user1890078 almost 2 years

    I have program which implements database of peoples and his companies. I have created dynamic array of pointer to class members instead of dynamic array of class members, cause copying is quicker with it.

    I have version which works but valgrind shows mismatch delete in destructor (delete db)

    CCompany** db;
    
    ~CCompanyIndex ( void )
    {
        for(unsigned i=0;i<len;i++)
        {
            /*cout<<"dealloc:"<<db[i]<<endl;*/
            delete db[i];
        }
        delete db;
    }
    
    CCompanyIndex ( void )
    {
        max=1000;
        len=0;
        db=new CCompany*[max];
    }
    

    I use also to add

    CCompany* newIt=new CCompany(oName,oAddr,cName,cAddr);
    

    So I have tried following code which I consider correct previously

    ~CCompanyIndex ( void )
    {
        delete [] db;
    }
    

    But then all memory allocated by adding method is not deallocated.

  • Jerry Coffin
    Jerry Coffin over 11 years
    Better still, don't use new[] or delete[]. Use a vector and be happy.