错误试图实现STL迭代器
Error trying to implement STL iterators
我是STL和迭代器的新手。我已经经常使用它们,但直到现在才了解它们的真正工作方式。对于作业,我的任务是重新编写一些Stl迭代器,以了解引擎盖下的情况。我在insert_iterator
中途:
template <class Container>
class m_insert_iterator : public std::iterator<output_iterator_tag, void,
void, void, void>
{
protected:
Container* container;
typename Container::iterator it;
public:
typedef Container container_type;
// Constructor:
m_insert_iterator(Container &x, typename Container::iterator i)
{
*container = x;
it = i;
}
// Assignment operator:
m_insert_iterator<Container> &operator=(const typename Container::value_type &value)
{
it = container->insert(this, value);
++it;
return *this;
}
// No-ops:
m_insert_iterator<Container> &operator*() { return *this };
m_insert_iterator<Container> &operator++() { return *this };
m_insert_iterator<Container> &operator++(int) { return *this };
};
int main()
{
vector<int> v{ 2, 3, 4 };
m_insert_iterator<vector<int>> ins_it(v, v.begin());
ins_it = 1;
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
system("pause");
}
每当我调用构造函数时,我的程序都会在*container = x
上崩溃。在调试器中,我会收到一条错误消息,读取" 0xc0000005:访问违规读取位置0x00000000"。为什么会发生?
您的错误在于您对指针的理解,您无法将任何内容分配给非初始化的指针。因此,您无法在构造函数中分配对非初始化指针的引用:
*container = x; // container is uninitialized, so this function will generate an AccessViolation
相反,您应该将其用作
container = std::addressof(x);
在这种情况下,您可以用传递给您的参考的地址初始化指针,但是在您的情况下,您正在尝试将参考复制到地址,以解决您的指针指向它,并且由于您的指针未初始化,因此您是试图写入内存的未知位置。
在最好的情况下,您会得到一个访问的人或类似的东西,但是如果碰巧写入对您的程序的记忆,也可能会造成奇怪的错误。例如,您可以覆盖一个或多个变量的值
相关文章:
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- C++如何获取传递给函数(STL 迭代器)的参数的名称
- 如何将 stl 迭代器与特征一起使用?
- 用于 STL 迭代器、指针和 std::nullptr_t 的模板函数
- STL 迭代器继承:"value_type"不命名类型
- 错误试图实现STL迭代器
- 使用 stl 迭代器封装向量是否很好?如果是?怎么可能呢?
- 如何断言模板参数的类型 STL 迭代器类型
- 带有原始指针的stl::迭代器
- STL 迭代器:断言错误
- 多态性中的通用STL迭代器
- 使用STL迭代器的两个循环
- 如何在c++中对stl迭代器进行平均运算
- 如何使用STL迭代器和reverse_iterator处理数据
- DEV-C++5.11 STL迭代器的调试问题
- std::map::begin() 之前的 STL 迭代器
- 我是否可以轻松覆盖 (STL) 迭代器的类别?
- 如何使用 STL 迭代器处理结构
- STL 迭代器和数组的关系
- 使用c++stl迭代器而不是传统指针的正确方法是什么