此问题在此处已有答案:
What is a dangling reference? [duplicate](1个答案)
3天前关闭。
我在使用std::vector::iterator
时遇到了问题。首先,我定义了一个struct
:
template <typename T>
struct VecIter {
VecIter(std::vector<T>::iterator &&it_, size_t remain_):
it(it_), remain(remain_) {}
std::vector<T>::iterator ⁢
size_t remain;
T& operator * () {
return *it;
}
};
字符串
它只是一个常规迭代器的 Package 器。下面是一个测试类:
template <typename T>
class testA {
public:
testA(std::vector<T> &a) {
stack.push_back({a.begin(), a.size()});
}
std::vector<VecIter<T>> stack;
};
型
构造函数接受std::vector
作为输入,并初始化我们的迭代器 Package 器。下面是测试部分:
TEST(TestIterator, test_iter_in_stack) {
std::vector<int> a{3, 2, 1};
testA<int> sol(a);
auto x = sol.stack[0];
auto it = x.it; // extract the iterator
cout << *it << "\n"; // segmentation fault here...
it++;
cout << *it << "\n";
}
型
我的问题是为什么*it
会导致分段错误?我怀疑列表初始化stack.push_back({a.begin(), a.size()})
没有成功地传递迭代器。
我希望测试应该打印出3
和2
。欢迎任何意见。谢谢!
1条答案
按热度按时间noj0wjuj1#
VecIter::it
是对a.begin()
返回的临时对象的悬挂引用。您应该将std::vector<T>::iterator &it
更改为std::vector<T>::iterator it
。一般来说,迭代器可能比指针大不了多少,通过引用传递和存储它们可能不是必要的。标准库通常通过值传递它们,例如在
std::vector
constructor中。