内存位置作为放大动态数组中的最后一个值

时间:2017-03-09 13:48:41

标签: c++ arrays dynamic garbage

我将一个动态数组传递给一个函数,该函数的值应该被添加到数组中,当我动态放大并重置数组并迭代数组时,我发现数组的最后一个值是一个垃圾值而不是预期的。我已经看了一些关于SO的其他帖子以及一些文档,我很难理解我做错了什么。 我更喜欢使用矢量,但不幸的是,我的作业需要动态数组。有什么想法吗?感谢。

上面的帖子是通过引用传递指向向量的指针,与放大动态数组无关

主要

cout << "Please enter the size of the array of integers you would like to create: ";
    cin >> size;

    cout << "\nPlease enter your integers:\n";

    int *integerArray = new int[size];

    //store values in array
    for (int dynamicArrayDataCounter = 0; dynamicArrayDataCounter < size; dynamicArrayDataCounter++)
        cin >> integerArray[dynamicArrayDataCounter];

    cout << "\n Please enter the integer you would like to insert into this array: ";
    cin >> userInt;

    InsertIntegerToSortedList(integerArray, userInt, size);

    //Print array for proof
    for (int counterPrinter = 0; counterPrinter < size + 1; counterPrinter++)
        cout << endl << integerArray[counterPrinter];

    //Remove memory and repoint dangling pointer
    delete [] integerArray;
    integerArray = NULL;

    return 0;
}

功能

void InsertIntegerToSortedList(int *integerArray, int userInteger, int size)
{
    //Declare new array to add index position for integerArray
    int *resizedArray = new int[size + 1];
    bool numInserted = false;

    for (int counter = 0; counter < size + 1; counter++)
    {
        if (integerArray[counter] < userInteger)
        {
            resizedArray[counter] = integerArray[counter];
        }
        else if ((integerArray[counter] > userInteger && integerArray[counter - 1] < userInteger) || integerArray[counter] == userInteger || (integerArray[counter] <= userInteger && size - counter == 1))
        {
            resizedArray[counter] = userInteger;

            numInserted = true;
        }
        else if (numInserted)
            resizedArray[counter] = integerArray[counter - 1];
    }

    //Store resizedArray values in integerArray
    integerArray = resizedArray;

    //Remove dynamic array on heap and repoint dangling pointer
    delete[] resizedArray;
    resizedArray = NULL;
}

1 个答案:

答案 0 :(得分:4)

void InsertIntegerToSortedList(int *integerArray, int userInteger, int size)

您正在通过值传递指针integerArray,因此在函数的退出处,您最终不会修改它。通过引用传递,如

void InsertIntegerToSortedList(int* & integerArray, int userInteger, int size)

此外,正如评论中所提到的,你做得有点不对劲。首先,将数组元素复制到resizedArray。接下来,您需要删除旧数组

delete[] integerArray;

最后将新分配的数组分配给integerArray

integerArray = resizedArray;

需要全部,现在integerArray将指向通过resizedArray分配的内存。无需将resizedArray设置为NULL,它只是一个在函数出口处不再存在的局部变量。你关心的只是你分配的内存的地址,你已经将它存储到integerArray指针中。