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

像这样声明的静态数组

int test[3] = {10,487,-22};

称为 vector 的动态数组
std::vector<int> a;

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

我已经看到了有关此问题的答案(并且里面有成千上万的线条和概念),但是它们并没有阐明我的概念。

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

Stroustrup在这一章中说过, vector 是安全的,而数组不是,而没有说明原因。我确实相信他,但是为什么呢?安全性与内存的位置有关吗? (堆/堆栈)

我想知道为什么我会使用安全的 vector 。

最佳答案

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

如果声明动态数组

int * arr = new int[size]

并且您不执行delete [] arr,则内存仍未清除,这称为内存泄漏。应该注意的是,每当您在C++中使用“新建”一词时,都必须在其中某处删除以释放该内存。如果使用malloc(),则应使用free()。

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

超越数组的界限也很容易,例如,在大于其大小-1的索引中插入一个值。使用 vector ,您可以根据需要push_back()任意数量的元素,并且 vector 将自动调整大小。如果您使用大小为15的数组,并尝试说arr [18] = x,
然后,您将获得细分错误。该程序将进行编译,但在到达将其置于数组范围之外的语句时将崩溃。

通常,当您有大型代码时,很少使用数组。 vector 在几乎所有方面都客观地优越,因此使用数组变得毫无意义。

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

关于c++ - 动态和静态数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41005659/

10-11 02:06
查看更多