c++ - "Grow"动态数组函数产生错误

标签 c++ dynamic-arrays

初级程序员在这里。 下面的代码似乎总是遇到一个错误,称为:“未分配正在释放的指针”,我不明白为什么。

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

我是否为这个“增长”代码函数写了一些不正确的东西?

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];

您为两者使用了相同的临时数组。

然后你做:

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

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

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

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

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

因此您需要修复此问题以使用两个单独的 new int 数组。

(或者将所有这些替换为 std::vector,因为它们更易于管理。)

关于c++ - "Grow"动态数组函数产生错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31755334/

相关文章:

c# - 从托管C#代码中调用非托管C++代码以生成脱机域加入Blob

c++ - 帕斯卡三角形程序的间距 C++

c++ - mingw中的套接字编程

delphi - 在 Delphi 中如何将动态数组保存到 FileStream?

c++解析动态数组中的getline

delphi - 如何获取动态整数数组的最小值和最大值?

c++ - 是否可以在运行时在堆上创建一个数组,然后在需要时分配更多空间?

c++ - 创建指针数组时 operator new[] 的语法

c++交叉遗传算法push_back vector 覆盖旧的

c++ - 按位将 uint32_t 强制转换为 C/C++ 中的 float