如何通过分配和交易失配解决此错误

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

本文关键字:解决 错误 失配 交易 何通过 分配      更新时间:2023-10-16

cppcheck报告作为错误"与 delete cname;的行不匹配分配和交易:cname"。我看不出使用我的代码版本的问题 - 看起来有效。

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

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

是的,当您使用new …[…]语法分配数组时,应使用delete[]对其进行处理。在您的情况下,您需要delete[] cname;

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

§5.3.5/2 [expr.delete] 在第一个替代方案( delete对象)中, delete的操作数的值可能是无效指针值,指向以前 new-expression 创建的非阵列对象的指针,或指向代表这种对象基类的子对象的指针。如果没有,则行为是未确定的。在第二个替代方案( delete数组)中,delete的操作数的值可能是由以前的数组 new> new> new-expression 产生的零指针值或指针值。如果不是,则行为是未固定的。

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