С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 28.02.2023
Сообщений: 26

Неконсистентное состояние unordered_map после удаления последнего элемента

22.03.2023, 01:05. Показов 1756. Ответов 10
Метки с++ (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер! Есть вот такой код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
    struct group_chat_member
    {
        virtual void start_communication(anet::socket_data_ptr socketData) = 0;
        virtual void send_message_handler(anet::socket_data_ptr socketData, 
                                    const boost::system::error_code &error) noexcept = 0;
        virtual ~group_chat_member() = default;
    };
    
    typedef std::unique_ptr<group_chat_member> group_chat_member_ptr;
    typedef std::shared_ptr</*оболочка под сокет и std::string*/> socket_data_ptr;
    
    struct chat_room :  public boost::noncopyable                  
    {
        using activeMembers = std::unordered_map<socket_data_ptr, group_chat_member_ptr>;
    
        activeMembers activeMembers_;
        
    private:
        mutable std::shared_mutex mutex;
 
    public:
        void enter_member(const socket_data_ptr& socketData, 
                                       group_chat_member_ptr&& newMember)
        {
          mutex.lock();
          activeMembers_.insert(std::make_pair(socketData, std::move(newMember)));
          mutex.unlock();
        } 
        
        void leave_member(socket_data_ptr socketData)
        {
          std::cout << activeMembers_.empty() << '\n';//0
          std::lock_guard lock(mutex);
          activeMembers_.erase(socketData);
          std::cout << activeMembers_.empty() << '\n';//1
        }
    };
    typedef std::shared_ptr<chat_room> chat_room_ptr;
 
    
    struct simple_group_chat_member :   public group_chat_member, public boost::noncopyable
    {                                   
    private:
        chat_room_ptr myRoom_;
        name_t name_;
 
    public:
        simple_group_chat_member(const chat_room_ptr& myRoom, const name_t& name) ;
        
        //....
        void forced_leave(socket_data_ptr socketData)
         {
            std::cout << myRoom_->activeMembers_.empty() << '\n';//0
            myRoom_->leave_member(socketData);
            std::cout << myRoom_->activeMembers_.size() << '\n';//мусор
            std::cout << myRoom_->activeMembers_.empty() << '\n';//0
         }
        //...
    };


Вывод когда вызываю forced_leave на последний элемент хэш мапы:
0
0
1
*мусор*
0 //?
Дальнейшее использование мапы абсолютно не приносит пользы, вылетает ошибка segmentation fault. Никак не могу понять почему так происходит.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.03.2023, 01:05
Ответы с готовыми решениями:

Функции вставки элемента и удаления последнего элемента из односвязного списка
Здравствуйте, есть код, нужно переделать функцию удаления так, чтобы удалялся не конкретный элемент, а последний #define...

Функция удаления последнего четного элемента
Помогите, нужно составить функцию удаления из состава массива последний четный элемент.

Удаления из списка последнего элемента путем рекурсии
Здравствуйте! Нужна помощь в написании кода для удаления из списка последнего элемента путем рекурсии. Код есть, но он не работает в том...

10
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.03.2023, 09:29
А почему мьютекс используется не для всех функций map?
0
0 / 0 / 0
Регистрация: 28.02.2023
Сообщений: 26
22.03.2023, 10:56  [ТС]
nmcf, вызовы empty были добавлены для целей отладки и вызываются из 1 потока (гонки быть не может).
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.03.2023, 11:33
Если ты используешь многопоточность, то вероятно, что дело в совместном доступе.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
22.03.2023, 12:27
Цитата Сообщение от NanoCase Посмотреть сообщение
вызовы empty были добавлены для целей отладки и вызываются из 1 потока (гонки быть не может).
Не важно это, откуда они вызываются. Если потоков, имеющих доступ к ресурсу больше одного, то гонка быть может.

Добавлено через 4 минуты
И еще настораживает, что потенциально многопоточный доступ делается к открытому полю activeMembers_. Это ж означает, что любой код может его использовать в обход контракта. А код тут не весь, значит предполагать можно что угодно.
0
0 / 0 / 0
Регистрация: 28.02.2023
Сообщений: 26
22.03.2023, 12:32  [ТС]
nmcf, вроде разобрался, все пользователи хранятся в одной структуре данных, и получается что при вызове leave_member я удаляю вызывающую сторону(this), и дальнейшее использование this по всей видимости приводит к UB.

Добавлено через 4 минуты
DrOffset, отлаживаю код только 1 клиентом -> гонки быть не может. activeMembers_ сделал открытым чтобы можно было вызывать его методы из forced_leave .
0
22.03.2023, 12:43

Не по теме:

Цитата Сообщение от NanoCase Посмотреть сообщение
отлаживаю код только 1 клиентом -> гонки быть не может.
Нам-то этого не известно, Мы работаем с предоставленным кусочком кода и с полным недоверием к тому, что вы говорите словами (потому что обычно ТСы заблуждаются в своих выводах) :)

Цитата Сообщение от NanoCase Посмотреть сообщение
activeMembers_ сделал открытым чтобы можно было вызывать его методы из forced_leave .
Плохо. Надо контракт сохранять за интерфейсом.
Ну да ладно, разобрались, так разобрались.
Шансов только у нас по этому кусочку кода понять не было, в чем на самом деле проблема, надеюсь вы это понимаете.

0
22.03.2023, 13:18  [ТС]

Не по теме:


DrOffset, я понимаю. старался все лишнее вырезать и оставить только суть проблемы. по всей видимости не получилось(

0
33 / 25 / 8
Регистрация: 18.12.2022
Сообщений: 83
22.03.2023, 13:33
Можно дать задачу и что собственно делаем? Это гораздо проще, чем искать ошибки в чужом коде...
0
22.03.2023, 20:20  [ТС]

Не по теме:

Цитата Сообщение от OSPFv3 Посмотреть сообщение
Можно дать задачу и что собственно делаем?
задача была в том чтобы понять, почему программа выдает ошибку.
Цитата Сообщение от OSPFv3 Посмотреть сообщение
Это гораздо проще, чем искать ошибки в чужом коде...
каким образом вы собрались без кода найти ошибку в работе программы? Я не литкод, программу могу и сам написать, а вот ошибки которые в ней возникают ставят в ступор, не понимаю как без наличия кода их описывать .

0
22.03.2023, 20:51

Не по теме:

Цитата Сообщение от NanoCase Посмотреть сообщение
не понимаю как без наличия кода их описывать .
Кидайте код. Лично у меня нет никаких проблем с чтением чужого кода любого размера.
Единственная причина, по которой я могу отказаться помогать - это нехватка времени на экспертизу. Все-таки я бесплатно здесь. И это не только у меня.

Поэтому кидайте код, кидайте. Если есть возможность сделать минимизированный пример и снабдить его комментариями по поводу того, что нужно сделать, то повысите шансы на помощь. Но вообще без кода помощи (адекватной, без профанации, гадания, нравоучений или выдумывания задачи за вас) можно и не дождаться.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.03.2023, 20:51
Помогаю со студенческими работами здесь

Написать программу удаления последнего элемента списка
Написать программу удаления последнего элемента списка.

Поправить функцию удаления последнего элемента односвязного списка
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace std; struct elem { int data; elem...

Стек, операция удаления последнего (верхнего) элемента стека
Добрый вечер. Для написания лабораторной потребовалось расписать основные операции над стеком. Всё хорошо, да вот с удалением последнего...

Некорректно работает процедура удаления последнего элемента из стека.
Доброго времени суток. Пишу программку для работы со стеком. Вроде как все нормально, но вот некорректно работает процедура удаления...

Как можно идентификаторы, после удаления какой-то строки по середине, вернуть в состояние от 1 до n
Как можно идентификаторы, после удаления какой-то строки по середине, вернуть в состояние от 1 до n например: 1,2,3,4,5,6,7,8,9 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru