HM088 new 与 delete 成对使用
HM088 new 与 delete 成对使用
来源: 第 88 集 程序的内存模型-new运算符
难度: 入门
时间限制: 1s
空间限制: 64MB
题目描述
堆区内存由程序员手动开辟、手动释放。开辟用 new,释放用 delete。new 返回的是该类型的指针:new int 得到 int *,new double 得到 double *。
两套写法必须分清:
- 单个数据:
int *p = new int(10);小括号里是初始值,表示堆上有一个整数 \(10\)。用完后delete p;。释放后再解引用是非法操作,会失去访问权限。 - 数组:
int *arr = new int[10];中括号里是元素个数,不是初始值。它返回这段连续空间的首地址。可以像栈上数组一样用下标读写,例如arr[i] = i + 100。释放必须写成delete[] arr;,中括号告诉编译器这是一整段空间;只写delete arr只会按一个元素释放,是错误的。
本题要真的 new / delete / new[] / delete[]。释放之后不要再去解引用那块内存,用状态标记输出 illegal 即可。
输入格式
第一行一个整数 \(q\)(\(1 \le q \le 100\))。
接下来 \(q\) 行,每行一个操作:
1\ x:new int(x)并立刻输出该值。2:delete当前单个整数。3:访问当前单个整数;已释放或尚未创建则输出illegal。4\ n\ b:new int[n],令arr[i] = b + i(\(0 \le i < n\)),再按顺序输出这 \(n\) 个数。\(1 \le n \le 100\),\(|b| \le 1000\)。5:delete[]当前数组。6\ i:访问arr[i];数组已释放、尚未创建或下标越界则输出illegal。
输出格式
按操作即时输出。操作 4 的 \(n\) 个数在同一行,相邻之间一个空格。行末换行。
样例
输入 #1
6
1 10
3
3
2
3
4 10 100
输出 #1
10
10
10
illegal
100 101 102 103 104 105 106 107 108 109
输入 #2
4
4 3 0
6 1
5
6 1
输出 #2
0 1 2
1
illegal
说明
样例 1 先在堆上创建 \(10\),释放前多次访问都正确;delete 后再访问输出 illegal。随后开辟长度为 \(10\) 的堆数组,元素为 \(100\) 到 \(109\)。释放数组必须使用 delete[]。
信息
- ID
- 1087
- 难度
- (无)
- 分类
- (无)
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 通过率
- ?
- 上传者