好吧,我在网上搜索了关于动态扩展数组的内容,发现在 C++ 中是不可能的。我必须使用 C 版本的 malloc
、realloc
或 C++ 中的 std::vector
。但下面的代码似乎工作得很好。
#include<iostream>
using namespace std;
int main() {
int len = 10;
int *p = new int[len];
for (int i = 0; i < len; i++){
p[i] = i + 1;
}
*(p + len) = 1000; // extend here.
len++;
for (int i = 0; i < len; i++){
cout << p[i] << endl;
}
return 0;
}
那么如果我在大程序中使用这种方式,有什么问题吗?为什么人们说这是不可能的?如果是因为扩展区域可能已经被其他信息或其他东西填满了? 我只想知道上面的做法对不对。如果不是,那究竟是为什么?
最佳答案
这有时会起作用,因为写入未分配的内存是未定义的行为。当操作系统因为调皮而杀死你时,最终注销数组的末尾会让你出现段错误。
如果您需要可调整大小的数组,请使用 C++ std::vector
。缺点几乎为零。它为您处理重新分配和取消分配的所有复杂情况。它还会在调整大小时做正确的事情,以便附加到数组的分摊时间为 O(1)。
您可以使用realloc
来调整数组的大小,但它有可能被复制到新位置。 但是你不能对你用new
创建的东西使用realloc
!它一定是用 malloc
和 friend 分配的。 new
和 new[]
必须与 delete
和 delete[]
, malloc
和 friend 一起去 free
。
如果您使用 C 函数在 C++ 程序中分配内存,则会遇到其他危险。 C 函数不会在为用户定义或标准库类型分配的数组上运行构造函数。
简而言之,直接分配和调整数组大小充满了陷阱,当我们有一个很棒的类在 std::vector
中自动做正确的事情时,这是不值得的。
关于c++ - 在 C++ 中扩展数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21629230/