【问题标题】:How do I fix this error with allocation and deallocation mismatch?如何通过分配和解除分配不匹配来解决此错误?
【发布时间】:2014-02-25 08:26:40
【问题描述】:

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;
 }      

【问题讨论】:

  • 数组释放是通过“delete [] cname”完成的

标签: c++ cppcheck


【解决方案1】:

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

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

§5.3.5/2 [expr.delete] 在第一种选择(delete object)中,delete 的操作数的值可能为 null指针值,指向由先前的 new-expression 创建的非数组对象的指针,或指向表示此类对象的基类的子对象的指针。如果不是,则行为未定义。在第二种选择(delete array)中,delete 的操作数的值可能是空指针值或由先前数组产生的指针值new-expression。如果不是,则行为未定义。

【讨论】:

  • 谢谢。知道了。哦……真的很简单。以及使用我的代码版本的后果是什么?
  • @abrahab 最可怕的后果:未定义的行为。
  • @abraab 标准报价已添加到我的答案中。
  • 基本上,delete[] 变体将调用每个数组对象的析构函数。如果是标量值,它可能看起来并不重要,但如果您要定义一个类数组,则差异很大。
【解决方案2】:
if ( lenght != 0 )
    {
        char *cname = new char[lenght+1];   
        inbin.read(reinterpret_cast<char *>( cname ), lenght );
        cname[lenght] = '\0';
        *ptr_string = cname;                
        delete[] cname;
    }    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2020-07-29
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多