如果delete
释放内存,那么为什么前两个元素被重置为其初始垃圾值,而其余两个元素却没有被重置?删除指针后,我得到异常输出。请解释它是如何工作的以及为什么我会得到这样的输出。
#include<iostream>
using namespace std;
int main()
{
int i;
int *q = new int[10];
int *r;
r=q;
printf("%d %d\n",*r,*(r+1));
for(i=0;i<10;i++)
q[i]=100;
delete[] q;
for(i=0;i<10;i++)
{
cout<<"r="<<*(r+i)<<" ";
cout<<"q="<<*(q+i)<<"\n";
}
return 0;
}
代码输出如下:
8389928 8388800 r = 8389928 q = 8389928 r = 8388800 q = 8388800 r = 100
q = 100 r = 100 q = 100 r = 100 q = 100 r = 100 q = 100 r = 100 q = 100 r = 100
q = 100 r = 100 q = 100 r = 100 q = 100
答案 0 :(得分:8)
您的代码具有未定义的行为(这意味着它有故障,实际上什么都可能发生),
通过将*r
和*(r+1)
分配给这些对象之前,您正在读取未初始化的内存。 new int[]
不会以任何方式初始化分配的内存:必须先分配值,然后才能从中读取数据。
顺便说一句,请注意,*(r+1)
通常写为r[1]
。
(问题编辑后,该部分不再适用)您已经使用new []
分配了内存,但是正在使用delete
取消了分配。 new[]
必须始终与delete[]
配对(并且new
与delete
配对)。
在删除r
(和q
)指向的内存后,通过解除引用q
和r
来访问不再拥有的内存(即使您使用了正确的delete[] q;
)。释放内存后,将不再允许您访问其内容。