“Grow"用于生成错误的动态数组的函数

"Grow" function for dynamic arrays generating an error

本文关键字:错误 动态 数组 函数 Grow quot 用于      更新时间:2023-10-16

这里是初级程序员。下面的代码似乎总是遇到一个错误,叫做:"被释放的指针没有分配",我不知道为什么。

struct包含动态数组,用于在读取文件后存储整数和字符串。该文件包含城市名称、高温和低温的列表。然后,在读取这些行之后,将它们存储到动态数组中,并在必要时增加动态数组(大小加倍)。

我是否为这个"增长"代码函数写了一些错误的东西?

int i = 0;
if ( i >= arr1.size){    //arr1 is a int declared in a struct
    string *tempStr;  //temporary string
    tempStr = new string[arr1.size*2];
    int *tempInt;   //temporary int
    tempInt = new int[arr1.size*2];
    for (int a = 0; a < arr1.size; a++){
        tempStr[a] = arr1.cityName[a]; //cityName is a dynamic array declared in struct as a string
        tempInt[a] = arr1.hiTemp[a]; //hiTemp --> dynamic array declared in struct as an int
        tempInt[a] = arr1.loTemp[a]; //loTemp --> dynamic array declared in struct as an int
            }
    delete[] arr1.cityName;
    delete[] arr1.hiTemp;
    delete[] arr1.loTemp;
    arr1.cityName = tempStr;
    arr1.hiTemp = tempInt;
    arr1.loTemp = tempInt;
    arr1.size = arr1.size*2;   //doubling the size
}
i++;
    tempInt[a] = arr1.hiTemp[a];
    tempInt[a] = arr1.loTemp[a];

您使用了相同的temp数组。

然后你做:

arr1.hiTemp = tempInt;
arr1.loTemp = tempInt;

现在你的结构体有两个不同的指针指向同一个数组。

这意味着下次在该结构体上运行你的增长算法时,它将到达:

delete[] arr1.hiTemp;
delete[] arr1.loTemp;

,然后尝试删除相同的内存两次,这当然是非常糟糕的。

所以你需要解决这个问题,使用两个单独的new int数组。

(或者只是将所有这些替换为std::vector s,因为这些更容易管理。)