动态数组实际上是动态的吗?

如何解决动态数组实际上是动态的吗?

我正在阅读有关动态数组的信息(特别是在 https://www.learncpp.com/cpp-tutorial/dynamically-allocating-arrays/),在我看来,动态数组实际上并不是动态的,因为分配给它们的大小无法更改。

如果我理解正确,动态数组与固定数组的主要用途或要点是动态数组将在堆上而不是堆栈上分配,因此可以更大。 “动态”和“固定”这两个词给我的印象是一个可以改变而另一个不能,但事实似乎并非如此。

这是正确的,还是我误解了动态数组和固定数组?

解决方法

动态数组是动态的,即它们具有动态生命周期/动态存储(即它们存储在自由存储区,即“堆”中)。

动态数组也是动态的,因为与数组变量不同,它们的大小可以在运行时确定,即它不需要是编译时常量。示例:

int size;
std::cin >> size;
auto ptr = std::make_unique<int[]>(size); // dynamic
int arr[size]; // ill-formed

您说得对,(动态)数组的大小在其生命周期内无法改变。因此,C++ 中的动态数组不是同名的抽象数据结构,也称为“可增长数组”、“可调整大小的数组”、“动态表”、“可变数组”或“数组列表”。 C++ 标准库通过名称 std::vector 实现了该数据结构。

,

“动态”不是指大小,而是指分配方法。在大多数 C++ 实现中,有多种存储数据的方法,但这里的两种相关方法是本地的(如在堆栈中)和动态的(如在堆中)。

动态往往意味着“用 new 分配”或类似的机制,而堆栈分配是隐式发生的。

X* x = new X[20]; // "Dynamic" array
X x[20]; // Local array

这些都不能轻松调整大小。

动态数组可以重新分配和调整大小,而堆栈不能,堆栈上的大小是固定的。这使得动态数组在这方面更加灵活,但它不是免费提供的,您需要做很多工作来实现它,以确保您新分配的对象是一致的,并且所有指向它的指针都已更新。

此外,生命周期是不同的,因为动态分配的结构具有无限的生命周期,作为您控制的程序员,而局部变量具有不可协商的范围定义的生命周期。当您退出范围时,它们就消失了。

对于程序员而言,动态分配会带来相当大的开销,您负责管理该生命周期或将其委托给可以为您完成的包装器,例如 smart pointer

在现代 C++ 中,使用实际的低级数组既困难又容易出错,这就是通常使用 std::vector 的原因。如果使用得当,它提供了更多的保证并帮助您管理生命周期。这些的实现为您管理调整大小和对象删除。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?