为什么在矢量中指向有效int的指针未定义?

时间:2019-02-19 18:46:30

标签: c++ pointers

我有一个将指针放入10x10 std :: pointer指针的函数。我制作了一个包含整数的全局向量,并具有一个创建新整数的函数,将其放入向量中并在网格中分配其地址。 当我尝试访问网格时,即使我的所有值都应初始化,我也会得到垃圾值。

我不确定我的错误在哪里。我检查了向量,所有创建的飞船都在那里。由于我的对象还活着,所以我不明白为什么我的指针不起作用。

#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 :(得分:3)

调用my_special_ints.push_back(temp_int);时,引导程序将在其容量已满时分配新的内存。发生这种情况时,您为先前int创建的所有指针将失效。

有几种可能的解决方案。一种是reserve的容量(如果您知道要添加多少个整数,然后再开始添加它们)。

另一种解决方案是将modifying_function分成两部分。首先,您需要将所有整数添加到my_special_ints数组中。然后遍历该数组并更新您的g网格。