Безопасность функции pop() у контейнера

427
27 октября 2017, 13:34

Трудно сделать безопасной функцию, выполняющую две различных операции.

Далее говорилось, что на основании этого функция pop() из класса std::stack (или другого контейнера, имеющего pop-возможность) не возвращает значение, которое ликвидируется из контейнера, поскольку оно может потеряться, если соответствующий operator= или конструктор, принимающий это значение возбудит исключение.

Вопрос: можно ли в pop(T& value) сделать параметр value, в который будет сохраняться ликвидируемое значение? В таком случае не должно быть потери значения в результате исключения. Будет ли такая реализация безопасной?

Например, такая реализация:

template<typename T>
void Stack<T>::pop(T& value)
{
    if (this->m_size != 0)
    {
        value = m_array[m_size - 1];
        --m_size;
    }
}
Answer 1

Саттер в своей "Решение сложных задач на С++" признает это решение безопасным с точки зрения исключений (задача 2.3, стр. 112).

Но это решение он отвергает именно как выполняющее две задачи одновременно, а не как опасное с точки зрения исключений.

Так что ответ на ваш вопрос - да :)

Но! Этот pop() не гарантирует иное - снятие значения со стека. Если там лежит какой-то мерзкий элемент, который при копировании генерирует исключение - то при наличии отдельных top() и pop() вы можете получить на него ссылку не копируя сам элемент и поработать с ним, а потом pop() снять его со стека.

Но ваш pop() может просто ничего не суметь сделать и угробить программу вечным исключением :)

READ ALSO
Изменение существующей строки

Изменение существующей строки

ЗдравствуйтеМне хотелось бы понять, как можно реализовать изменение строки, введенной прежде с помощью функции getline в консольном приложении

255
Как отследить утечку памяти

Как отследить утечку памяти

Работаю под Visual StudioКак узнать, есть ли в программе утечка памяти или нет?

263
:hover не работает

:hover не работает

Не работает hover

346