在我的程序中的以下代码中(当然简化),funcA和funcB中的输出是不同的,这意味着指针的值在整个过程中的某处发生了变化。我无法确认face
的地址已更改,因为此错误在调试器(QT Creator的调试器)中不会弹出。但这是代码:
void funcA() {
Face *face = funcB();
if (face != NULL) {
cout << "in funcA " << face->vertices[0] << endl;
}
}
Face * funcB() {
vector<Face> faces;
//populate faces
...
Face *face = &(faces[index]);
cout << "in funcB " << face->vertices[0] << endl;
return face;
}
虽然输出根据鼠标点击的位置而变化,但上面两个函数的输出变化很大(在funcB中它将是例如30,而在funcA中它将变为18117600 ......我只有60个面!)它似乎随机出现,而不是所有时间。
非常感谢任何帮助。
答案 0 :(得分:5)
您将返回指向返回后不再存在的本地值的指针。
答案 1 :(得分:5)
首先使用带有STL容器的 raw 指针可能很危险。
vector<Face> faces;
是funcB()
的本地,因此在函数返回后,它会被销毁并留下dangling pointer(曾经指向有效当地价值)。 使用悬空指针调用Undefined Behaviour。
答案 2 :(得分:3)
您返回的局部变量faces[index]
的地址在funcB
返回后无效。一旦faces
终止,向量funcB
中的对象就会被删除,并且您将返回已删除对象的地址。这将调用未定义的行为。