繁体   English   中英

为什么在动态分配的数组中初始长度不能为1?

[英]Why can't initial length be 1 in a dynamically-allocated array?

假设我们开始于:

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)都会破坏动态内存分配的整个目的...

编辑:这是在学校,我们还不允许使用向量。

该语言不会为您“动态分配内存”。 您有责任分配和重新分配数组,以便其大小足以满足您的目的。

在C ++中,“动态分配”的概念从不意味着内存会以某种方式自动为您分配自身。 在此上下文中,“动态”一词仅表示在运行时(而不是编译时)确定新对象的参数和生存期。 动态内存分配的主要目的是:1)手动控制对象的生存期,2)在运行时指定数组大小,3)在运行时指定对象类型。

第二点是什么可以让你做到这一点

int n = ...; // <- some run-time value
int *array = new int[n];

对于非动态分配的数组,这是不可能的。

在您的示例中,如果大小最初为1,则可以分配一个数组。 这没什么错。 但是,分配更大的新阵列,将数据复制到新阵列并在阵列中需要更多空间后释放旧阵列仍然是您的责任。

为了避免所有麻烦,您应该简单地使用库提供的可调整大小的容器,例如std::vector

它可以动态调整自身大小,因此它不是动态的。 它是动态的,因为它的大小可以在运行时动态选择,而不是在编译时选择。 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;    
}

您只为一个int创建空间,但是试图存储多个int ,这当然会崩溃。 即使创建的大小为100,当您尝试保存第101个值时,它仍然会崩溃。

如果需要自动调整容器大小,请检查std::vector

#include <vector>

std::vector<int> data;

while (inputFile >> newValue)
{
    data.push_back(newValue);
}

这将一直起作用,直到您的进程用尽内存为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM