Почему этот указатель, который должен указывать на действительное значение int в векторе, не определен? - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть функция, которая помещает указатель в массив указателей 10x10 std ::.Я создал глобальный вектор, который содержит целые числа и имеет функцию, которая создает новые целые, помещает их в вектор и назначает их адрес в сетке.Когда я пытаюсь получить доступ к сетке, я получаю нежелательное значение, даже если все мои значения должны быть инициализированы.

Я не уверен, где моя ошибка.Я проверил вектор и все мои созданные корабли там.Поскольку мои объекты еще живы, я не понимаю, почему мой указатель не работает.

#include <iostream>
#include <array>
#include <vector>

using namespace std;
using grid = array<array<int*, 10>, 10>;

vector<int> my_special_ints{};

grid fill_grid(int* val) {
    grid g;
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            g[i][j] = val;
        }
    }
    return g;
}

void modifying_function(grid& g) {
    for (int i = 0; i < 10; i++) {
        int temp_int = i + 10;
        my_special_ints.push_back(temp_int);
        g[i][0] = &my_special_ints.back();
    }
}

int main()
{
    int empty_int = -1;
    grid ptr_arr = fill_grid(&empty_int);

    modifying_function(ptr_arr);
    cout << *ptr_arr[1][0]; // junk value

}

1 Ответ

0 голосов
/ 19 февраля 2019

Когда вы вызываете my_special_ints.push_back(temp_int);, вектор выделит новую память, если его емкость заполнена.Это приведет к аннулированию всех указателей, которые вы создали для своих предыдущих целых, когда это произойдет.

Существует несколько возможных решений.Одним из них будет reserve достаточной емкости (если вы знаете, сколько целых чисел вы добавите, прежде чем начнете их добавлять).

Другим решением будет разделить modifying_function на две части.Сначала вы добавите все целые числа в массив my_special_ints.Затем перейдите в этот массив и обновите сетку g.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...