我们假设我们从:
开始int *newArray = new int[1];
然后有类似的东西:
ifstream inputFile("File.txt");
Counter=0;
while (inputFile >> newValue)
{
newArray[Counter] = newValue;
Counter++
}
如果我尝试从文本文件中提取100行,程序最终会崩溃。但是,如果我使用了
int *newArray = new int[100];
最初,它不会崩溃。
如果它是动态分配内存,为什么它需要一个大于1的初始值?这对我来说毫无意义。必须定义超过一个小数字(如1或10)的任何初始长度都会破坏动态内存分配的整个目的......
编辑:这是针对学校的,我们不允许使用矢量。答案 0 :(得分:4)
语言不会为您“动态分配内存”。您有责任分配和重新分配阵列,以便它们的大小足以满足您的需要。
C ++中“动态分配”的概念从未意味着内存会以某种方式为您自动分配。此上下文中的“动态”一词仅表示新对象的参数和生命周期是在运行时确定的(与编译时相反)。动态内存分配的主要目的是:1)手动控制对象的生命周期,2)在运行时指定数组大小,3)在运行时指定对象类型。
第二点是允许你这样做的原因
int n = ...; // <- some run-time value
int *array = new int[n];
这对于非动态分配的数组是不可能的。
在您的示例中,如果最初为大小1,则可以分配数组。这没关系。但是,您仍然有责任分配一个新的,更大的阵列,将数据复制到新阵列,并在阵列中需要更多空间后释放旧阵列。
为了避免所有麻烦,您应该只使用库提供的可调整大小的容器,例如std::vector
。
答案 1 :(得分:1)
它可以动态调整自身的意义上不是动态的。它的动态在于它的大小可以在运行时动态选择,而不是编译时。 C ++的主要哲学之一是你不为你不使用的东西买单。如果动态数组以您要求的方式工作,那将需要边界检查,这是我不需要的,所以我不想为此付费。
无论如何,问题是通过标准库解决的。
std::vector<int> vec;
...
while (inputFile >> newValue)
{
vec.push_back(newValue);
}
那不是更好吗?你甚至不必跟踪大小,因为vector会为你跟踪它。
如果你不能使用矢量,那么你就会有很多工作要做。原则基本上就是这个。你保留2个额外的整数变量。一个用于指示阵列中使用的值的数量,另一个用于指示阵列的当前容量。当你用完房间时,你会分配更多空间。例如,这是一个穷人的非异常安全版本的矢量:
int size = 0;
int capacity = 1;
int array = new int[capacity];
while (inputFile >> newValue)
{
if (size == capacity)
{
capacity *= 2;
int * newArray = new int[capacity];
for (int i=0; i<size; ++i)
newArray[i] = array[i];
delete [] array;
array = newArray;
}
array[size++] = newValue;
}
答案 2 :(得分:0)
你只为一个int
创建空间,但试图存储几个,当然它崩溃了。即使您使用100号创建它,当您尝试保存第101个值时它仍然会崩溃。
如果您需要自动调整大小的容器,请查看std::vector
。
#include <vector>
std::vector<int> data;
while (inputFile >> newValue)
{
data.push_back(newValue);
}
这将一直有效,直到您的进程耗尽内存。