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

abr*_*hab 5 c++ cppcheck

Cppcheck报告错误"错误分配和释放:cname"为该行delete 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;
 }      
Run Code Online (Sandbox Code Playgroud)

Jos*_*eld 10

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

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

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