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代码>完成后
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;