- 论坛徽章:
- 0
|
先看两段代码,引出对下面问题的思考:
代码段1:
#include <iostream>
using namespace std;
int main()
{
int * p = new int;
delete p;
*p = 3;
cout<<*p<<endl;
p= p+100;
*p = 4;
cout<<p<<endl;
cin.get();
return 0;
}
运行结果为:3 0x33f38 后一个输出地址
#include <iostream>
using namespace std;
int main()
{
int * p = new int;
delete p;
*p = 3;
cout<<*p<<endl;
p= p+200;
*p = 4;
cout<<p<<endl;
cin.get();
return 0;
}
编译运行会出现运行时错误
想引出的问题是这样的,为何动态申请的内存被释放掉之后还可以对其进行访问?delete操作到底做了什么事情?
由于p是指向进程的堆空间,为何对地址为p+100的内存块可以访问,而对地址为p+200的内存块访问时就有问
题?系统为进程分配的堆大小不可能小于1K,而p到p+200的地址空间还不足1K,该进程又没有其它的堆内存使用. |
|