HM088 new 与 delete 成对使用

HM088 new 与 delete 成对使用

HM088 new 与 delete 成对使用

来源: 第 88 集 程序的内存模型-new运算符

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

堆区内存由程序员手动开辟、手动释放。开辟用 new,释放用 deletenew 返回的是该类型的指针:new int 得到 int *new double 得到 double *

两套写法必须分清:

  1. 单个数据int *p = new int(10); 小括号里是初始值,表示堆上有一个整数 \(10\)。用完后 delete p;。释放后再解引用是非法操作,会失去访问权限。
  2. 数组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\ xnew int(x) 并立刻输出该值。
  • 2delete 当前单个整数。
  • 3:访问当前单个整数;已释放或尚未创建则输出 illegal
  • 4\ n\ bnew int[n],令 arr[i] = b + i(\(0 \le i < n\)),再按顺序输出这 \(n\) 个数。\(1 \le n \le 100\),\(|b| \le 1000\)。
  • 5delete[] 当前数组。
  • 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
通过率
?
上传者