动态分配内存——Ada应用实例之十二

动态分配内存——Ada应用实例之十二

 

  C++中可以用操作符new在堆上动态创建一个对象,这实际上是获得了一块内存空间,并有一个指针指向这块内存。正常情况下,我们对这块内存的操作不能越界。然而,由于疏忽可能没有创建足够的空间,这时就可能出现操作越界。遗憾的是,C++编译器不会检测这类错误,运行出错时也不易找到原因。

 

  一个帖子(http://topic.csdn.net/u/20110111/19/f546fdb1-e23d-4626-a57b-1033438ce071.html

)报告了调试中的奇怪现象,在VC6 debug单步看变量xy的值都正确,去掉断点后直接执行时变量y的值不正确,如果交换xy的相关语句,则结果都正确。

 

  这个问题可以用以下的简单程序来复现:

  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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值