c++ - 无法解释为什么在创建指针 vector 的 vector 时指针变得悬空

标签 c++ pointers dangling-pointer

考虑以下代码:

#include <iostream>
#include <vector>

using namespace std;

class SomeClass {
public:
    SomeClass(int num) : val_(num) {}
    int val_;
    int val() const { return val_; }
};

// Given a vector of vector of numbers, this class will generate a vector of vector of pointers
// that point to SomeClass.
class Generator {
public:
    vector<SomeClass> objects_;
    vector<vector<SomeClass*> > Generate(const vector<vector<int> >& input) {
        vector<vector<SomeClass*> > out;
        for (const auto& vec : input) {
            out.push_back({});
            for (const int num : vec) {
                SomeClass s(num);
                objects_.push_back(s);
                out.back().push_back(&objects_.back());
            }
        }
        return out;
    }
};

int main() {
    Generator generator;
    auto output = generator.Generate({{2, 3}, {4, 5}, {6}});
    for (const auto& vec : output) {
        for (const auto* obj : vec) {
            printf("%d ",obj->val());
        }
        printf("\n");
    }
    return 0;
}

Generator 类中的Generate 方法将简单地将int vector 的 vector 转换为指向SomeClass.

SomeClass 只是一个带有 getter 方法的简单 int 值的容器。

我希望得到以下输出:

2 3
4 5
6

但是,我得到以下输出:

junk_integer junk_integer
4 5
6

看起来第一行的指针变成了悬挂指针。这段代码有什么问题?

最佳答案

您将指针存储到一个vector 中,然后向该 vector 添加元素。由于您没有为要添加的所有元素保留足够的空间,因此当 vector 调整大小时,它会使所有指向旧数据的指针无效。

您要么必须在存储指针之前预留足够的空间,要么在将所有内容存储到需要存储的 vector 中之后存储指针,要么不存储指针(可能存储索引)。

关于c++ - 无法解释为什么在创建指针 vector 的 vector 时指针变得悬空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43024987/

相关文章:

c: 调试模糊内存泄漏的策略?

c++ - 执行我程序的 .exe 文件时出错

c++ - Visual Studio 是否发出错误的汇编代码?

c++ - 交换原始指针和迭代器

c++ - 指针 - 删除

c - 将 void 指针作为函数参数传递以获取新地址(char、int)

c++ - 是否可以在其范围之外访问局部变量的内存?

c++ - 如何读取 OpenCV 中的像素值?

c++ - vector 迭代器 C++

c++ - 删除C++中的悬挂指针