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