[noob; c++] ссылка на элемент массива
Или это просто случайность и бага где-то в другом месте?Напиши const std::string&
Если делать все так, как ты описал, ошибок быть не должно. Даже если бы ты менял a и b. Скорее всего ошибка в другом месте. Что дебагер говорит?
Чисто для интереса: платформа, компилятор, версия библиотеки?
Алсо да, ссылки, использующиеся только для чтения, обязаны быть константными.
gcc version 4.4.3
Есть такой кусок коданужно больше кода. в приведенном коде проблем не видно. какой-то важный момент почикан руками
Что имеется ввиду под "обязаны"?
Хм. А при чём здесь многопоточность, если в приведённом коде нет общих данных?
ну типа хороший тон. Ссылки вообще в таких ситуациях хз зачем нужны, если их не собираются модифицировать. А если собираются, то тоже похоже на говнокод, если честно. Но надо увидеть весь кусок, может там само изящество на самом деле.
ссылки зачем? ну либо указатели либо ссылки, не копировать же объекты. а так ссылка как алиас используется - удобно
вроде как std::string не thread-safe (по крайней мере в gcc) и даже при копировании (а вдруг под чтением подразумевалось копирование и чтение?) вполне может включить не-thread-safe-COW, который всё свалит
может включить COWэто вырезали уже достаточно давно. больше таких сюрпризов в гцц нет
ссылки зачем? ну либо указатели либо ссылки, не копировать же объекты. а так ссылка как алиас используется - удобнону у меня нету предрассудков вроде «ни за что не копировать объект». Строки как-то привык копировать не парясь в основном. Не, если там все тормозит страшно из-за этого, то можно и подумать...
ну у меня нету предрассудков вроде «ни за что не копировать объект»у меня нет предрассудков перед значком & и некоторыми очевидными оптимизациями
лишний раз копировать строку, если можно этого не делать, нужно делать осознанно
Напиши const std::string&Как это защищает от v.clear()?
это вырезали уже достаточно давно. больше таких сюрпризов в гцц нетСмотрел string в gcc-4.8.1, есть там упоминания COW с комментариями:
template<typename _CharT, typename _Traits, typename _Alloc>
class basic_string
....
// 3. _M_refcount has three states:
// -1: leaked, one reference, no ref-copies allowed, non-const.
// 0: one reference, non-const.
// n>0: n + 1 references, operations require a lock, const.
Бабка Ванга подсказывает, что дело может быть в "оптимизации" вида "давайте удалим v, раз уж он дальше не используется"
и не допускают таких автоматических оптимизаций.
По крайней мере, такие, как C++.
---
"Унивеpситет pазвивает все способности, в том числе --- глупость."
ну у меня нету предрассудков вроде «ни за что не копировать объект». Строки как-то привык копировать не парясь в основном. Не, если там все тормозит страшно из-за этого, то можно и подумать...О, а мне еще как-то попался cpp, внутри которого были определены функции, в одной из которых аргумент имел тип QString & (даже без const), а в другой std::string (безо всяких ссылок). Очень радовался.
При том что ни в одной из функций строковый аргумент, разумеется, не модифицировался.
Смотрел string в gcc-4.8.1, есть там упоминания COW с комментариями:действительно, комменты есть, только при беглом просмотре выяснил, что refcount может быть 0 или -1
и это не удивительно, так как COW противоречит стандарту C++11 (нарушает требования к сложности некоторых операций)
но само наличие атомарных операций удручает
std::string не thread-safe (по крайней мере в gcc)несмотря на COW std::string спокойно можно читать из нескольких потоков. есть простая гарантия многопоточности (как и у shared_ptr). это верно как для старых gcc, так и для новых
Собственно, вопрос : почему так происходит?Посмотри стек в GDB в момент падения, все должно быть намного более очевидно, чем гадание по кускам странного кода.
Оставить комментарий
Yzzi
Есть такой кусок кода :run() вызывается в разных потоках.
Периодически программа падает (segmentation fault).
После замены замены ссылок на строки :
программа падать перестала. Нагрузка - та же.
Собственно, вопрос : почему так происходит? Я понимаю, что ссылаться на элементы вектора - плохая затея, но там вроде реаллокаций нет (после определения ссылок), вектор вообще не трогается. Деструктор для a и b тоже вроде бы не должен вызываться.
Или это просто случайность и бага где-то в другом месте?