如何通过分配和释放不匹配来修复此错误?

时间:2014-02-01 16:21:13

标签: c++ cppcheck

Cppcheck报告为delete cname;行的错误“不匹配分配和释放:cname”。我没有看到使用我的代码版本有什么问题 - 它看起来很有效。

我的代码错了吗?我如何解决它?使用我的代码有什么后果?

if ( lenght != 0 )
{
   char *cname = new char[lenght+1];    
   inbin.read(reinterpret_cast<char *>( cname ), lenght );
   cname[lenght] = '\0';
   *ptr_string = cname;             
   delete cname;
 }      

2 个答案:

答案 0 :(得分:9)

是的,当您使用new …[…]语法分配数组时,应使用delete[]取消分配。在您的情况下,您需要delete[] cname;

如果您使用错误的delete形式将您的分配与new相匹配,则您有未定义的行为:

  

§5.3.5/ 2 [expr.delete] 在第一个备选方案(删除对象)中,delete的操作数值可能是空指针值,指向由前一个 new-expression 创建的非数组对象的指针,或指向表示此类对象的基类的子对象的指针。如果不是,则行为未定。在第二种方法(删除数组)中,delete的操作数的值可以是空指针值或由前一个数组 new-expression <产生的指针值/ em>的。如果没有,则行为未定。

答案 1 :(得分:1)

if ( lenght != 0 )
    {
        char *cname = new char[lenght+1];   
        inbin.read(reinterpret_cast<char *>( cname ), lenght );
        cname[lenght] = '\0';
        *ptr_string = cname;                
        delete[] cname;
    }