C++ 删除无效的指针

C++ 删除无效的指针,c++,memory,glibc,delete-operator,C++,Memory,Glibc,Delete Operator,输出: 1234567894567 现在我有三个问题 delete a+4只删除a+4处的字符,对吗 如果上一个答案是肯定的,那么a[0]会发生什么。我们应该得到输出 要删除一块内存,我们应该写delete[]。但是在这种情况下,为什么所有的元素都被删除了呢 否。delete与new相反。实际上,您删除了分配时得到的相同指针。删除其他指针未定义,因此出现“无效指针”错误。如果分配了数组,则必须使用delete[]。现在,您正在泄漏(“未释放”)内存。所以使用delete[]a完成后 不太适用

输出:

1234567894567 
现在我有三个问题

  • delete a+4
    只删除
    a+4
    处的字符,对吗
  • 如果上一个答案是肯定的,那么
    a[0]
    会发生什么。我们应该得到输出
  • 要删除一块内存,我们应该写
    delete[]
    。但是在这种情况下,为什么所有的元素都被删除了呢
  • 否。
    delete
    new
    相反。实际上,您删除了分配时得到的相同指针。删除其他指针未定义,因此出现“无效指针”错误。如果分配了数组,则必须使用
    delete[]
    。现在,您正在泄漏(“未释放”)内存。所以使用
    delete[]a完成后

  • 不太适用

  • <> >因为C++就是这样工作的。这是用于释放已分配阵列的操作

    似乎要从字符串中删除一个字符,然后打印该字符串。如果是这样,请考虑使用<代码> STD::String ,并使用它的代码>删除< /Cult>成员函数。无论如何,
    a[0]
    是一个
    char
    ,而不是
    char*
    ,后者是一个C样式的字符串。你应该

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

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

  • 空指针值。他们只是被忽视了
  • 以前分配了
    new
    的完整标量(非数组)对象,可以是:
    • new
    • 指向
      new
      返回的指针的基子对象的指针,当且仅当基子对象的类型具有
      virtual
      析构函数
  • 任何这些指针值都不应传递给标量
    delete

  • 数组
    new
    new[]
    的结果(改用
    delete[]
  • malloc
    或任何其他非
    new
  • 具有自动或静态存储持续时间的对象的地址
  • 成员子对象或数组元素的地址
  • 未初始化的指针值
  • 指向已删除对象的指针
  • 如果您违反此规则,您将获得未定义的行为。这意味着您的程序可能会因检测到无效删除而崩溃。或者你的数据可能被破坏,保存在数据文件中,发送给你的老板,展示给客户,然后你被解雇。所以不要违反规则

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



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

    你不能“删除一个字符”。那么我怎么才能得到内存呢?我们可能应该有一个规范的答案“什么指针值可以与C++删除运算符一起使用?”呃,删除字符数组。你特别说“要删除一块内存,我们应该写delete[]”。是的,这个。当我要删除a+4时,内存被破坏了,然后我们无法访问同一块的任何元素。是这样吗?谢谢。但我不明白你答案的最后一行。你说你应该…是什么意思?我是说如果你不想打印字符串,那么如果你想打印字符串,而不是单个字符,然后传递指向第一个字符的指针并打印,直到找到空字节(字符串结束标记)。如果你只想打印一个字符,那你就做对了。很乐意帮忙。祝你好运。如果这开始成为一个规范性的问题,我会很高兴地添加引用标准。
    character at 7-th position.6  
    *** glibc detected *** ./test free() invalid pointer:....  
    
    cout << a;