Исключение выдается при написании функции вставки для sLinkedList - PullRequest
0 голосов
/ 22 октября 2019

Я пишу функцию "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());
        }

    }

Это должно вставить новый номер, который я передал, чтобы вставить себя в список перед повторяющейся позицией.

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Я подозреваю, что

previous->setNext(newNode);

вызывает проблему. unique_ptr<> является подвижным, но не копируемым. Итак, предполагая, что ваша функция setNext() действительно переместила newNode, вызов newNode->setNext() плохо сформирован.

И если вы не переместили его (например, g - const unique_ptr<> &), то адресудаляется, когда unique_ptr выходит из области видимости (доступ к неверному адресу).

0 голосов
/ 22 октября 2019

Вы используете локальную переменную

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

, как только вы выходите из области действия void insertBefore (конец функции), эта newNode будет удалена. Таким образом, весь список окажется в несогласованном состоянии, и если setNext переместит значение, то newNode будет недействительным после первой строки:

        previous->setNext(newNode);
        newNode->setNext(temp->next());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...