diff --git a/lifetime/vector_invalidation.md b/lifetime/vector_invalidation.md index 14b08e7..4ea2809 100644 --- a/lifetime/vector_invalidation.md +++ b/lifetime/vector_invalidation.md @@ -68,7 +68,7 @@ void run_actions(std::vector actions) { } ``` -Этот простой паттерн с инвалидацией ссылок в векторе может очень легко спрятаться под слоем абстракций. Например — цикл обработки является публичным методом класса `TaskQueue`, а обработка одной задачи — его приватный метод. В таком случае изменение в одном методе, совершенно корректное в рамках него, приведен к UB из-за неявного влияния на другой метод. +Этот простой паттерн с инвалидацией ссылок в векторе может очень легко спрятаться под слоем абстракций. Например — цикл обработки является публичным методом класса `TaskQueue`, а обработка одной задачи — его приватный метод. В таком случае изменение в одном методе, совершенно корректное в рамках него, приведет к UB из-за неявного влияния на другой метод. Кое-как защититься от подобной неприятности можно с помощью статических анализаторов, работающих с потоком исполнения программы. Также проблема почти точно ловится санитайзерами или утилитами проверки памяти (например, valgrind). Если, конечно, у вас достаточно хорошие тесты. @@ -79,4 +79,4 @@ void run_actions(std::vector actions) { ## Полезные ссылки 1. https://baptiste-wicht.com/posts/2012/11/cpp-benchmark-vector-vs-list.html -2. https://stackoverflow.com/questions/6438086/iterator-invalidation-rules \ No newline at end of file +2. https://stackoverflow.com/questions/6438086/iterator-invalidation-rules