Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Логика удаления map 
:(
    Опции темы
cupper
Дата 31.5.2011, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Встретил в чужом коде непонятную мне логическую конструкцию
Код

ClassX::~ClassX()
{
    SessionsMap sessions( sessions_ );
    sessions_.clear();

    for_each(sessions.begin(), sessions.end(), Utils::ReleaseSecond());
}

Код

typedef std::map<std::string, Session*> SessionsMap;
struct ReleaseSecond{
        template<typename T1, typename T2>
            void operator()(const std::pair<T1, T2>& p) {
                 p.second->release();
        }
    };


И озадачился сакральным смыслом того что перед удалением мапы, его копируют во временный мап, потом подчищаю оригинал. И После проводят корректное удаление указателей на Session через временно созданные map.
PM MAIL   Вверх
boostcoder
Дата 31.5.2011, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



стандартная практика в асинхронном/многопоточном коде.
т.е. detach`имся от sessions_, в копии вызывается release() для каждого Session, и в тоже самое время, sessions_ может заполняться новыми Session`ами.

Добавлено через 6 минут
Цитата(boostcoder @  31.5.2011,  19:39 Найти цитируемый пост)
detach`имся от sessions_

все равно странно то, почему никак не защищена операция копирования... если моя мысль верна.
PM WWW   Вверх
azesmcar
Дата 1.6.2011, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(boostcoder @  31.5.2011,  19:39 Найти цитируемый пост)
стандартная практика в асинхронном/многопоточном коде.

А что, там планировалось асинхронно вызванному деструктору выполнять еще какие-то операции над объектом? smile 

Цитата(cupper @  31.5.2011,  18:47 Найти цитируемый пост)
И озадачился сакральным смыслом того что перед удалением мапы, его копируют во временный мап, потом подчищаю оригинал.

Мало ли что, может результат copy-paste-а. У нас таких кодов столько, что если каждым озадачиваться... smile 

Это сообщение отредактировал(а) azesmcar - 1.6.2011, 08:12
PM   Вверх
cupper
Дата 1.6.2011, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Цитата(boostcoder @ 31.5.2011,  19:39)
стандартная практика в асинхронном/многопоточном коде.
т.е. detach`имся от sessions_, в копии вызывается release() для каждого Session, и в тоже самое время, sessions_ может заполняться новыми Session`ами.

в деструкторе О_о ? Дабы развеять все мифы, переменная session_ находится сугубо только в этом классе и на ружу не как не торчит. 

Наверно все таки это "кодоляп" (от "киноляп"). Решил подстраховаться от возможной своей глупости.

Это сообщение отредактировал(а) cupper - 1.6.2011, 08:39
PM MAIL   Вверх
boostcoder
Дата 1.6.2011, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(azesmcar @  1.6.2011,  08:11 Найти цитируемый пост)
что, там планировалось асинхронно вызванному деструктору выполнять еще какие-то операции над объектом?

почему нет?

Цитата(cupper @  1.6.2011,  08:37 Найти цитируемый пост)
в деструкторе О_о ? Дабы развеять все мифы, переменная session_ находится сугубо только в этом классе и на ружу не как не торчит.

ну тогда хз..
PM WWW   Вверх
azesmcar
Дата 1.6.2011, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(boostcoder @  1.6.2011,  08:44 Найти цитируемый пост)
почему нет?

Потому-что проводить какие-либо манипуляции с объектом, который на данный момент удаляется, немного...мммм...необычно. smile 
PM   Вверх
boostcoder
Дата 1.6.2011, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



что в этом коде необычного?
Код

#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>
#include <algorithm>
#include <iostream>

struct Session {
   void release() {}
};

typedef std::map<std::string, Session*> SessionsMap;

struct ReleaseSecond{
   template<typename T1, typename T2>
   void operator()(const std::pair<T1, T2>& p) {
      p.second->release();
   }
};

struct ClassX {
   ~ClassX () {
      SessionsMap sessions(sessions_);
      std::for_each(sessions.begin(), sessions.end(), ReleaseSecond());
   }

   SessionsMap sessions_;
};

int main() {
   boost::shared_ptr<ClassX> ptr(new ClassX);
   boost::thread t([ptr]() {;});
}

http://liveworkspace.org/code/741dcee654ae...69bf5c96da8adad

если опустить это:
Цитата(cupper @  1.6.2011,  08:37 Найти цитируемый пост)
переменная session_ находится сугубо только в этом классе и на ружу не как не торчит

вполне себе законный код, если предположить что объекты ClassX "живут" в каком-то контейнере обернутые в shared_ptr, и при необходимости "выбрасываются" из него.

или что?

PM WWW   Вверх
azesmcar
Дата 1.6.2011, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



boostcoder

Разница в том, что в твоем коде объект не будет удаляться, пока с ним работают, так-как shared_ptr будет держать его в живом состоянии, пока поток на него ссылается, а значит работы с удаленном объектом здесь не будет, а если

Цитата(azesmcar @  1.6.2011,  08:53 Найти цитируемый пост)
проводить какие-либо манипуляции с объектом, который на данный момент удаляется

то закончиться это как ни странно segmentation fault -ом.

Это сообщение отредактировал(а) azesmcar - 1.6.2011, 09:54
PM   Вверх
boostcoder
Дата 1.6.2011, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(azesmcar @  1.6.2011,  09:54 Найти цитируемый пост)
закончиться это как ни странно segmentation fault -ом

оно и ясно.
похоже не правильно поняли изначально друг-друга..

Добавлено через 2 минуты и 27 секунд
но если sessions_ приватный, смысл создания копии в деструкторе все равно не понятен..

cupper, а друзей у него нет?
PM WWW   Вверх
bsa
Дата 1.6.2011, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



кстати. очень "интересный" подход. я бы это сделал через swap - операция значительно быстрее, чем две (копирование и очистка).
PM   Вверх
mes
Дата 1.6.2011, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



а держит ли _second_ ссылку/указатель на classX или SessionsMap?



--------------------
PM MAIL WWW   Вверх
xvr
Дата 1.6.2011, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(mes @ 1.6.2011,  11:55)
а держит ли _second_ ссылку/указатель на classX или SessionsMap?

Скорее всего держит.  smile 
Вполне стандартная ситуация, когда какие то объекты [Session] регистрируются (и дерегестрируются) в каком то менеджере [ClassX], и процесс дерегистрации запускается автоматом при удалении объекта [Session] и при этом производятся какие то нетривиальные действия в менеджере [ClassX].
Удаление скопом всего списка зарегистрированных объектов перед разрушением самого менеджера позволит не выполнять этих самых нетривиальных действий, а так же делать вид, что никаких объектов уже в менеджере нет (если эти самые Session при удалении полезут исследовать содержимое ClassX)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.