Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I fix this error with allocation and deallocation mismatch?

Tags:

c++

cppcheck

Cppcheck report as an error "Mismatching allocation and deallocation: cname" for the line with delete cname;. I don't see what the problem with using my version of code is - it looks working.

Is my code wrong? How do I fix it? And what are the consequences of using my code?

if ( lenght != 0 )
{
   char *cname = new char[lenght+1];    
   inbin.read(reinterpret_cast<char *>( cname ), lenght );
   cname[lenght] = '\0';
   *ptr_string = cname;             
   delete cname;
 }      
like image 233
abrahab Avatar asked Feb 01 '14 16:02

abrahab


2 Answers

Yes, when you allocate an array using the new …[…] syntax, you should deallocate it using delete[]. In your case, you need delete[] cname;.

If you use the wrong form of delete to match your allocation with new, you have undefined behaviour:

§5.3.5/2 [expr.delete] In the first alternative (delete object), the value of the operand of delete may be a null pointer value, a pointer to a non-array object created by a previous new-expression, or a pointer to a subobject representing a base class of such an object. If not, the behavior is undefined. In the second alternative (delete array), the value of the operand of delete may be a null pointer value or a pointer value that resulted from a previous array new-expression. If not, the behavior is undefined.

like image 128
Joseph Mansfield Avatar answered Oct 19 '22 04:10

Joseph Mansfield


if ( lenght != 0 )
    {
        char *cname = new char[lenght+1];   
        inbin.read(reinterpret_cast<char *>( cname ), lenght );
        cname[lenght] = '\0';
        *ptr_string = cname;                
        delete[] cname;
    }    
like image 39
Hamza Avatar answered Oct 19 '22 04:10

Hamza