动态和静态数组

Dynamic and static array

我正在学习 C++ 阅读 Stroustrup 的书,我认为这本书在这个主题(数组)中不是很清楚。据我了解,C++ 有(如 Delphi)两种数组:

声明为

的静态数组
int test[3] = {10,487,-22};

称为向量的动态数组

std::vector<int> a;

a.push_back(10);
a.push_back(487);
a.push_back(-22);

我已经看到了关于这个的答案(里面有很多行和概念)但是他们没有阐明我的概念。


据我了解,vectors 消耗更多内存,但它们可以更改其大小(实际上是动态的)。相反,数组具有在编译时给出的固定大小。

Stroustrup 在章节中说向量是安全的而数组不是,但没有解释原因。我确实信任他,但为什么呢?安全的原因与内存的位置有关吗? (heap/stack)

我想知道为什么我要使用载体,如果它们是安全的。

我能看到的一个安全性是您无法访问 vector 中不存在的内容。

我的意思是,如果您 push_back 只有 4 个元素并且您尝试访问索引 7,那么它将返回一个错误。但在数组中并没有发生。

简而言之,它会阻止您访问损坏的数据。

编辑:

程序员必须将索引与 vector.size() 进行比较才能抛出错误。它不会自动发生。必须在 himself/herself.

之前完成

数组不安全的原因是内存泄漏。

如果声明动态数组

int * arr = new int[size]

而你不做 delete [] arr,那么内存仍然没有清除,这就是所谓的内存泄漏。应该注意的是,任何时候你在 C++ 中使用 new 这个词,那里的某个地方必须有一个 delete 来释放那块内存。如果你使用malloc(),那么就应该使用free()。

http://ptolemy.eecs.berkeley.edu/ptolemyclassic/almagest/docs/prog/html/ptlang.doc7.html

数组也很容易越界,例如在索引中插入一个大于其大小 -1 的值。使用矢量,您可以 push_back() 任意数量的元素,矢量将自动调整大小。如果你有一个大小为 15 的数组,你试着说 arr[18] = x, 然后你会得到一个分段错误。该程序将编译,但当它到达将其置于数组边界之外的语句时将崩溃。

一般来说,当你有大量代码时,很少使用数组。向量几乎在所有方面都客观地优越,因此使用数组变得毫无意义。

编辑:正如 Paul McKenzie 在评论中指出的那样,超出数组边界并不能保证出现分段错误,而是未定义的行为,由编译器决定会发生什么

让我们以从文件中读取数字为例。
我们不知道文件中有多少数字。

要声明一个数组来保存数字,我们需要知道容量或数量,这是未知的。我们可以选择一个像 64 这样的数字。如果文件中的数字超过 64 个,我们就开始覆盖数组。如果文件少于 64 个(比如 16 个),我们就是在浪费内存(不使用 48 个槽)。我们需要的是动态调整容器(数组)的大小。

要动态调整数组的容量,必须创建一个更大的新数组,然后复制元素并删除旧数组。

std::vector 将根据需要调整其容量。它为您处理内存的动态分配。

另一方面是将容器传递给函数。使用数组,您需要传递数组和容量。使用std::vector,你只需要传递向量。可以查询矢量对象的容量。