本篇文章给大家分享的是有关怎么使用寿命解决数组退化和越界访问,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
数组是c++从C语言继承过来的特性,使用方便同时又可以提供绝佳的性能,因此被广泛使用。但是简便的另一面就是风险,其中最大的两个问题就是退化(数组衰变)和越界访问(范围错误)。本如何提前使用C + + 20新特性周期解决数组退化和越界访问的问题。
首先看使用数组的最常见代码:
<节>int 数据[10];for (size_t 小姐:=,0;,小姐:& lt;, sizeof(数据)/sizeof(数据[0]);,+ + i),{,,,数据[我],=,0;}节>
数组被定义时,同时有个元素个数信息。使用这个信息可以对数组进行操作。但是在将数组作为一个参数传递给某个函数时,只能以指针形式传递,这就是数组退化。为了正确把握数组的大小一般需要同时传递数组的大小信息,例如下面的初始化函数就是如此:
<节>void init_data (int 缓冲[],size_t 大小){cout 才能;& lt; & lt;,“大??& lt; & lt;, size & lt; & lt;, endl;,, for (gsl:: index 小姐:=,0;,小姐:& lt;,大小;,+ + i),{,,,缓冲[我],=,我,,,},,缓冲[4],=,40;,,缓冲[20],=,20,,,//越界访问}节>
即使声明函数参数时形式上是数组,但所有的行为都和指针完全相同。还有一个问题就是,由于数组是一种完全暴露的数据结构,没有任何保护,例如代码中第8行,即使访问的第20个元素已经超过最初定义的10个元素,这种操作一般也会正常通过。但是接下来不知道哪个时刻,这个操作带来的影响就会以一种完全不相关的形式表现出来。数组大小信息获取,传递错误和越界操作具有引入容易,排查困难的特种,是许多程序员的噩梦。
为了解决这个问题,GSL引入了一个模板类,它可以同时管理数组的地址和大小。这个类将从c++ 20开始成为c++的标准功能。
使用了跨类的初始化函数如下:
<节>void init_data (GSL:: span节> 只要函数参数声明为:<代码> gsl: span
缓冲区,大小信息就会由跨模板类管理,接下来就可以像向量一样使用数组了。如果发生越界访问,会触发断言。
代码><代码>使用数组和跨度传递参数的示例代码如下:代码>
<节>int 主要(){,,,int 数据[10];,,,,for (size_t 小姐:=,0;,小姐:& lt;, sizeof(数据)/sizeof(数据[0]);,+ + i),{,,,,,,,(我)的数据,=,0;,,,,},,,,//使用数组传递参数,,,,init_data(数据,5),,,,,//使用寿命传递参数,,,,init_data(数据),,,,,return 0;}部分><代码>和使用数组的调用相比,增强功能(范围检查等)的同时还简化了数组的用法! 代码>
以上就是怎么使用寿命解决数组退化和越界访问,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。
怎么使用寿命解决数组退化和越界访问