C++ 为sLinkedList编写插入函数时引发异常

C++ 为sLinkedList编写插入函数时引发异常,c++,iterator,C++,Iterator,我正在编写一个“insertBefore”函数。我正在检查,看看这是否是功能的第一个开始(这是有效的)。然后,我试图让我的前一个迭代器指向所需的位置,方法是遍历整个列表,直到它的下一个迭代器等于传递到函数中的迭代器(即我要在前面插入的位置)。 现在,前面是我想要它的地方,我试图使它的下一个点指向新节点(我传递到函数中的那个节点),新节点指向它后面的旧迭代器 我试着替换迭代器 template <typename T, typename InputIterator> void SLin

我正在编写一个“insertBefore”函数。我正在检查,看看这是否是功能的第一个开始(这是有效的)。然后,我试图让我的前一个迭代器指向所需的位置,方法是遍历整个列表,直到它的下一个迭代器等于传递到函数中的迭代器(即我要在前面插入的位置)。 现在,前面是我想要它的地方,我试图使它的下一个点指向新节点(我传递到函数中的那个节点),新节点指向它后面的旧迭代器

我试着替换迭代器

template <typename T, typename InputIterator>
void SLinkedList<T, InputIterator>::insertBefore(InputIterator & t_position, T t_element) 
{
    //Q1

    SListNode<T>* temp = t_position.get();
    SListNode<T>* previous = m_head.get();

    std::unique_ptr<SListNode<T>> newNode = std::make_unique<SListNode<T>>(t_element, this);


    //If position is the head node
    if (t_position.get() == m_head.get())
    {
        insertFirst(t_element);
    }
    else
    {
        while (previous != temp)
        {
            previous = previous->next().get();
        }

        if (previous == temp)
        {
            previous->setNext(newNode);
            newNode->setNext(temp->next());
        }

    }
模板
void SLinkedList::insertBefore(输入计算器&t_位置,t_元素)
{
//Q1
SListNode*temp=t_position.get();
SListNode*previous=m_head.get();
std::unique\u ptr newNode=std::make_unique(t_元素,this);
//如果位置是头部节点
if(t_position.get()==m_head.get())
{
insertFirst(t_元素);
}
其他的
{
while(上一个!=临时)
{
上一个=上一个->下一个().get();
}
如果(先前==临时)
{
上一步->设置下一步(新建节点);
新建节点->设置下一步(临时->下一步());
}
}
这应该将我传递的新编号插入到迭代位置之前的列表中。

previous->setNext(newNode);
是问题的原因。
unique\u ptr
是可移动的,但不可复制。因此,假设函数
setNext()
确实移动了
newNode
,调用
newNode->setNext()
的格式不正确


如果您没有移动它(例如,g-
const unique\u ptr&
),那么一旦
unique\u ptr
超出范围(访问无效地址),地址就会被删除。

您使用了一个局部变量

std::unique_ptr<SListNode<T>> newNode;

请提取并提供一个,这样每个人都可以只获取代码、编译代码并重现您的问题。作为新用户,还可以获取和读取。无关:迭代器除了它所表示的节点之外,还可以保留对上一个节点的引用。使查找更简单。
while(previous!=temp)
看起来它会一直发展到
之前的
temp
,而不是
temp
之前的节点。可能想重新考虑一下。同意,但由于信息有限,不太可能提供解决方案。具体的解决方案是不可能的,但您可以提出一些建议,比如更智能的构造函数对于将节点与其下一个节点链接起来的
SListNode
,不需要第二行,然后
previous->setNext(std::make_unique(t_元素,this,previous->getNext())
。也就是说,我认为这个问题根本不应该得到回答。给出的代码片段表明该程序比未显示的代码更糟糕。您可以随心所欲地修复此问题,但询问者不太可能从中受益。缺少可重复性最低的示例,需要查看其setNext实现。然后你的答案是什么?发表评论,投票结束,然后继续回答一个可以回答的问题。你已经从几个可见的错误中选择了一个。你无法获得所有的错误,因为显示的结果表明,在未发布的代码中潜伏着更多的死亡。我想你是对的。下次我会记住它。谢谢。
        previous->setNext(newNode);
        newNode->setNext(temp->next());