其他分享
首页 > 其他分享> > c – 删除和无效指针

c – 删除和无效指针

作者:互联网

int main()
{
    char* a=new char[20];  
    cin>>a;  
    cout<<" character at 7-th position."<<a[6];  
    delete a+4;  
    cout<<a[0];
    return 0;
}

输入:

1234567894567 

输出:

character at 7-th position.6  
*** glibc detected *** ./test free() invalid pointer:....  

现在我有3个问题

>删除4只会删除4处的字符是否正确?
>如果对前一个的回答是肯定的,那么[0]会发生什么.我们应该得到输出.
>要删除一块内存我们应该写delete [].但是在这种情况下如何删除所有元素?

解决方法:

只有三种类型的指针值可以作为delete的操作数传递:

>空指针值.他们只是被忽略了.
>以前使用new分配的完整标量(非数组)对象,可以是:

> new返回的确切指针
>指向new返回的指针的基础子对象的指针,当且仅当基础子对象的类型具有虚拟析构函数时

任何这些指针值都不应该传递给标量删除:

>数组new或new []的结果(使用delete []代替)
> malloc或任何其他不是新的分配器的结果
>具有自动或静态存储持续时间的对象的地址
>成员子对象或数组元素的地址
>未初始化的指针值
>指向已删除对象的指针

如果违反此规则,则会出现未定义的行为.这意味着您的程序可能会崩溃,并显示一条消息,指出检测到无效删除.或者您的数据可能已损坏,保存在数据文件中,发送给您的老板,显示给客户,之后您会被解雇.所以不要违反规则.

您的代码属于“从不这样做#4”类别.

它以这种方式工作的原因是因为实现可以(并且大多数)跟踪称为元数据的额外信息以及每个分配的块.例如,块的大小,这对于启用重用非常重要.块的一部分没有元数据,并且可能没有任何方法可以从指针到中间找到元数据.

标签:c,memory,glibc,delete-operator
来源: https://codeday.me/bug/20191003/1850504.html