【发布时间】:2021-09-03 11:16:56
【问题描述】:
我有以下代码,由于read access violation 而失败:
#include <vector>
using namespace std;
vector<int>::iterator myIterator;
void foo(vector<int> vec) {
myIterator = vec.begin();
}
int main()
{
foo({ 10, 20, 30, 40 });
*myIterator; // Here it fails.
return 0;
}
经过一些调试,发现myIterator在函数foo()完成后就失效了。
那我做错了什么?
【问题讨论】:
-
变量
vec在您标记的行之前消失了。你认为迭代器应该指向哪里? -
你得到了一个临时向量的迭代器。为此,您需要在
main中创建一个命名变量来保存向量,然后将其引用传递给foo。 -
这个例子很漂亮。它又短又甜。但这并不能真正让我们知道您的目标是什么,这使得我们很难提供最佳解决方案。
-
你认为复制迭代器有什么作用?你认为迭代器是是什么?
-
C++ 不是 Java 或 JavaScript。 C++ 是一种基于值的语言——当您按值传递向量时,会生成向量的副本,因此该副本会在函数返回后消失。没有像其他语言那样发生引用恶作剧,其中传递一个对象意味着传递了一个引用。如果你想要 C++ 中的引用,你必须明确告诉 C++ 你想要一个引用。