Расположение памяти как последнее значение в расширенном динамическом массиве

Я передаю динамический массив функции со значением, которое предназначено для добавления в массив, и когда я динамически увеличиваю и сбрасываю массив и перебираю массив, я обнаруживаю, что последнее значение массива является значением мусора, а не тем, что ожидается. Я просмотрел несколько других сообщений о 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;
}

person StormsEdge    schedule 09.03.2017    source источник


Ответы (1)


In

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.

person vsoftco    schedule 09.03.2017
comment
Я думал, что массивы всегда передаются по ссылке? - person StormsEdge; 09.03.2017
comment
Это указатель, а не массив. - person drescherjm; 09.03.2017
comment
Кроме того, когда я делаю это исправление, я получаю все значения мусора, когда пытаюсь распечатать массив, а не только одно значение мусора в конце. - person StormsEdge; 09.03.2017
comment
Вы освободили память, выделенную для resizedArray, непосредственно перед выходом из функции. Вместо этого вы должны были освободить память для исходного массива. - person drescherjm; 09.03.2017
comment
@drescherjm Да, но я установил integerArray = массив с измененным размером ... мне нельзя заранее освобождать эту память? - person StormsEdge; 09.03.2017
comment
и когда я удаляю удаление и ноль для resizedArray, я снова получаю значение мусора в конце. - person StormsEdge; 09.03.2017
comment
освободите integerArray перед этим заданием. Не удаляйте resizedArray вообще. Это новый буфер, который вы только что выделили. Помните, что после integerArray = resizedArray оба указателя указывают на одно и то же место. - person drescherjm; 09.03.2017
comment
Что касается мусора в конце, очевидный ответ: вы вообще не вставляете новый номер. Ваше среднее состояние - беспорядок, и я не могу понять, что вы пытаетесь проверить. Нет никакой гарантии, что введенные числа были отсортированы в первую очередь, поэтому из-за этого может произойти сбой. Вы также проверяете, вставляли ли вы уже последний раз, когда это должно быть первым, что вы проверяете. Попробуйте заменить эту логику на более простую, если она уже вставлена, скопируйте, иначе, если число меньше, вставьте ее. Вне цикла проверьте, вставили ли вы его уже, а если нет, то поместите в конец. - person Kian; 09.03.2017