您的位置:首页 > 其它

动态分配内存——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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: