如何解决动态数组实际上是动态的吗?
我正在阅读有关动态数组的信息(特别是在 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 举报,一经查实,本站将立刻删除。