c++ - 为什么这个指向 vector 中有效 int 的指针未定义?

标签 c++ pointers

我有一个将指针放入 10x10 std::array 指针的函数。我制作了一个保存整数的全局 vector ,并具有创建新整数的函数,将它们放入 vector 中并在网格中分配它们的地址。 当我尝试访问网格时,我得到了垃圾值,即使我的所有值都应该被初始化。

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

#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

}

最佳答案

当您调用 my_special_ints.push_back(temp_int); 时,如果 vector 的容量已满,它将分配新的内存。发生这种情况时,这将使您为之前的整数创建的所有指针失效。

有几种可能的解决方案。一种方法是预留足够的容量(如果您知道在开始添加之前要添加多少个整数)。

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

关于c++ - 为什么这个指向 vector 中有效 int 的指针未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54773014/

相关文章:

c++ - MacOSX 上 Google Perftools CPU 分析器中的行号

c++ - 如何跳过空格而不是换行符

c - 指针和地址引用之间的区别

C中的字符指针减法

困惑 : Pointers and character arrays in C

c++ - 使用 '='运算符在C++中使两个数组相等

c++ - 当用户输入 "m"时,为什么我的代码不能直接进入 if 主体

c++ - 在抽象基类中声明静态常量成员,并将其分配给派生类中的值?

c++ - 使用 C++ 程序中的 raspistill 读取相机图像

c - 如何将指针数组的(结构)指针传递给函数?