动态分配内存——Ada应用实例之十二
2011-01-17 08:42
253 查看
动态分配内存——Ada应用实例之十二
C++中可以用操作符new在堆上动态创建一个对象,这实际上是获得了一块内存空间,并有一个指针指向这块内存。正常情况下,我们对这块内存的操作不能越界。然而,由于疏忽可能没有创建足够的空间,这时就可能出现操作越界。遗憾的是,C++编译器不会检测这类错误,运行出错时也不易找到原因。
一个帖子(http://topic.csdn.net/u/20110111/19/f546fdb1-e23d-4626-a57b-1033438ce071.html
)报告了调试中的奇怪现象,在VC6 下debug单步看变量x和y的值都正确,去掉断点后直接执行时变量y的值不正确,如果交换x与y的相关语句,则结果都正确。
这个问题可以用以下的简单程序来复现:
int *p = new int;
p[10] = 1234;
cout << "check p[10]" << endl;
cout << p[10] << endl;
第1行语句的正常写法是“int *p = new int[11];”,但由于漏了[11],实际只获得了一个int的空间,随后的语句“p[10] = 1234”成了越界操作。debug单步执行到最后p[10]的值仍是1234,但连续执行时最后显示p[10]的值是512。由于在执行“cout << "check p[10]" << endl;”时用到了p[10]指向的单元,所以1234被改写为512。
Ada语言中也有操作符new,也是用于动态创建对象。但Ada不允许编写“p[10] := 1234;”这样的赋值语句。首先,Ada不允许定义一个指针来指向匿名数组。必须先定义一个数组类型,指明该数组的分量类型和下标范围。其次,Ada将对超出范围的下标提出警告。对于上面的例子,用Ada要如下编写:
procedure main is
type array_10 is array (1 .. 10) of Integer;
p : access array_10 := new array_10;
begin
p(10) := 10;
p(11) := 11; --编译警告这行在运行时将引发异常。
end main;
C++中可以用操作符new在堆上动态创建一个对象,这实际上是获得了一块内存空间,并有一个指针指向这块内存。正常情况下,我们对这块内存的操作不能越界。然而,由于疏忽可能没有创建足够的空间,这时就可能出现操作越界。遗憾的是,C++编译器不会检测这类错误,运行出错时也不易找到原因。
一个帖子(http://topic.csdn.net/u/20110111/19/f546fdb1-e23d-4626-a57b-1033438ce071.html
)报告了调试中的奇怪现象,在VC6 下debug单步看变量x和y的值都正确,去掉断点后直接执行时变量y的值不正确,如果交换x与y的相关语句,则结果都正确。
这个问题可以用以下的简单程序来复现:
int *p = new int;
p[10] = 1234;
cout << "check p[10]" << endl;
cout << p[10] << endl;
第1行语句的正常写法是“int *p = new int[11];”,但由于漏了[11],实际只获得了一个int的空间,随后的语句“p[10] = 1234”成了越界操作。debug单步执行到最后p[10]的值仍是1234,但连续执行时最后显示p[10]的值是512。由于在执行“cout << "check p[10]" << endl;”时用到了p[10]指向的单元,所以1234被改写为512。
Ada语言中也有操作符new,也是用于动态创建对象。但Ada不允许编写“p[10] := 1234;”这样的赋值语句。首先,Ada不允许定义一个指针来指向匿名数组。必须先定义一个数组类型,指明该数组的分量类型和下标范围。其次,Ada将对超出范围的下标提出警告。对于上面的例子,用Ada要如下编写:
procedure main is
type array_10 is array (1 .. 10) of Integer;
p : access array_10 := new array_10;
begin
p(10) := 10;
p(11) := 11; --编译警告这行在运行时将引发异常。
end main;
相关文章推荐
- 简易计算器设计中的一个数据结构问题——Ada应用实例之二
- Adaboost算法与应用实例简析
- 嵌套循环的控制变量——Ada应用实例之十三
- 函数strspn的实现——Ada应用实例之八
- 数组的指定初始化——Ada应用实例之九
- C语言库函数大全及应用实例十二
- ADA Ⅱ型数 STL-set实例应用
- 数学函数的异常捕获——Ada应用实例之十
- 稳定婚姻的求解程序——Ada应用实例之一
- 平衡二叉树的节点搜索函数——Ada应用实例之四
- 实例教程十二:为应用添加多个Activity与参数传递
- 数组下标越界——Ada应用实例之三
- 实例教程十二:为应用添加多个Activity与参数传递
- C语言库函数大全及应用实例十二
- 赋值表达式——Ada应用实例之十一
- 结构体扩展——Ada应用实例之五
- 实例教程十二:为应用添加多个Activity与参数传递
- 枚举型自加——Ada应用实例之六
- 全局变量的初值——Ada应用实例之七
- FindWindowEX应用实例二则