7 нояб. 2008 г.

Ссылки, указатели...crashes

Как человек не очень искушённый в C++ я периодически оказываюсь в неприятных, и возможно глупых, ситуациях, связанных с такими мощщщными инструментами языка, как указатели и ссылки.

И так... item - ссылка, которая может вернуть список значений:
const std::list<std::string> &values = item->getValues();

После по этому списку пробегаюсь итератором и делаю некоторую работу с элементами.

При этом, существует вероятность, что в другом потоке значения item могут быть изменены, как в моё случае, очищены.

При следующем же обращении к итератору попадаем в ситуацию... crash!.

Всё дело в том, что &values есть ссылка на значения, которая к этому моменту уже перестала быть актуальной.

Поэтому, дабы избежать такой ситуации, можно получить копию списка item'а (копия будет создана автоматически через copy constructor std::list):
const std::list<std::string> values = item->getValues();

ps. разница только в одном символе &, но разница колоссальная.

Комментариев нет: