Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mismatch delete

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.

like image 376
user1890078 Avatar asked Mar 19 '13 22:03

user1890078


2 Answers

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.

like image 93
paddy Avatar answered Sep 21 '22 16:09

paddy


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)).

like image 34
Joseph Mansfield Avatar answered Sep 22 '22 16:09

Joseph Mansfield