class Vertex {
public:
int dist;
int num;
vector<Vertex*> edges;
Vertex() {}
Vertex(int num) : num(num) {}
};
class Solution {
public:
void updateMatrix(vector<vector<int>>& matrix) {
vector<vector<Vertex*>> bunker;
for (const vector<int>& in : matrix) {
vector<Vertex*> neu;
for (int i : in) {
Vertex k(i);
Vertex* v = &k;
neu.push_back(v);
}
bunker.push_back(neu);
}
for (const vector<Vertex*>& b : bunker) for (Vertex* k : b) cout << k->num << endl;
}
};
当输入矩阵{{1,2,3},{4,5,6},{7,8,9}时,函数只打印9。我做错了什么?
Vertex k(i);
这在这个循环中声明了一个局部变量,称为k
。
与自动作用域中声明的所有其他变量一样,此对象将在其作用域结束时自动销毁。
Vertex* v = &k;
neu.push_back(v);
紧接着,指向该对象的指针被添加到向量中。在那之后,对象立即被销毁,留下一个指向已销毁的悬挂引用的指针
代码的其余部分,试图使用这些指向已销毁对象的指针,是未定义的行为,您不能再期望任何有意义的结果。
我做错了什么?
您将指向即将不存在的对象的指针推送到向量中。当你尝试使用它们的时候,它们早已不见了。您的程序有未定义的行为。
与其使用指针,不如直接使用Vertex
。