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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> STL и многопоточность 
:(
    Опции темы
nerdy_weirdie
Дата 16.2.2011, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здравствуйте. Столкнулся со странной проблемой.
У меня есть класс CMyList унаследованный от std::list
В классе есть 1 метод добавляющий элемент в список и 4 удаляющих. Все они при этом защищены критической секцией. Несмотря на это в следующей функции иногда получаю невалидный итератор:
Код

void CMyList::Remove(__int64 qwId)
{
    CCSLock lock(this);
    CMyList::iterator it = begin();
    while (it != end())
    {
        if ((*it)->GetId()==qwId)
        {
            SAFEDEL(*it);
            erase(it);
            break;
        }
        it++;
    }
}

Иногда на строке SAFEDEL(*it); получаю итератор it = 0xfeeefeee и соответственно дебажная CRT мне говорит "list iterator not dereferencable". Откуда такой итератор мог здесь взяться?

Это сообщение отредактировал(а) nerdy_weirdie - 16.2.2011, 23:31
PM MAIL   Вверх
alexvs11
Дата 16.2.2011, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



студийный stl должен быть потокобезопасным, зато в коде есть ошибка
[0 1 2 ->3]
после erase 
[0 1 2 ->]
++it
?
PM MAIL   Вверх
nerdy_weirdie
Дата 17.2.2011, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо за ответ!
Что-то не нахожу ошибку. После erase идет break; и итератор не инкрементируется.
PM MAIL   Вверх
volatile
Дата 17.2.2011, 00:22 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(nerdy_weirdie @  17.2.2011,  00:12 Найти цитируемый пост)
Что-то не нахожу ошибку. После erase идет break; и итератор не инкрементируется. 

но он же у вас затем сравнивается с end() while (it != end()

А вообще наследовать от STL классов есть нехорошо.
Лучше их включать в класс в качестве членов.



PM MAIL   Вверх
alexvs11
Дата 17.2.2011, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



да, извините, осмотрелся
попробуйте поставить на входе в метод дебажный вывод, чтоб посмотреть кто перед ошибкой приходит, и правильно ли работает критическая секция
а что SAFEDEL делает?
еще в критических секция должны быть все куски кода, где идет доступ к его содержимому

PM MAIL   Вверх
volatile
Дата 17.2.2011, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Напишите так:
Код

it = erase(it);

PM MAIL   Вверх
alexvs11
Дата 17.2.2011, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



volatile, по break'у он из цикла выйдет
PM MAIL   Вверх
volatile
Дата 17.2.2011, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(alexvs11 @  17.2.2011,  00:31 Найти цитируемый пост)
 break'у он из цикла выйдет 

Упс, да действительно, сорри. туплю
Но в любом случае возможно он дальше используется.

и наследовать от STL классов, еще раз, очень не рекомендуется.

PM MAIL   Вверх
nerdy_weirdie
Дата 17.2.2011, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо за советы, разобрался. Как раз дебажный вывод и обращался по невалидному итератору )) но дебагер почему-то тыкал меня в совершенно другую строку. Модератор, удалите пожалуйста тему
PM MAIL   Вверх
azesmcar
Дата 17.2.2011, 07:49 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(alexvs11 @  16.2.2011,  23:51 Найти цитируемый пост)
студийный stl должен быть потокобезопасным, зато в коде есть ошибка

с каких это пор? 
PM   Вверх
borisbn
Дата 17.2.2011, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(volatile @  17.2.2011,  00:22 Найти цитируемый пост)
А вообще наследовать от STL классов есть нехорошо.Лучше их включать в класс в качестве членов.

Цитата(volatile @  17.2.2011,  00:36 Найти цитируемый пост)
и наследовать от STL классов, еще раз, очень не рекомендуется.

volatile, много раз слышал это из разных источников, но не могу понять, почему именно ? Спасибо.

Цитата(alexvs11 @  16.2.2011,  23:51 Найти цитируемый пост)
студийный stl должен быть потокобезопасным

чевойта ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Alexeis
Дата 17.2.2011, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(azesmcar @  17.2.2011,  08:49 Найти цитируемый пост)
с каких это пор?  

  Вот и я не пойму. Он потокобезопасен если много читают и никто не пишет. Если хоть кто-то пишет но ни какой потокобезопаности. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
azesmcar
Дата 17.2.2011, 10:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Alexeis @  17.2.2011,  10:49 Найти цитируемый пост)
  Вот и я не пойму. Он потокобезопасен если много читают и никто не пишет.

Вообще-то стандарт C++ даже в этом случае не гарантирует безопасности, вдруг какой нибудь умник взял и написал модифицирующий код в read-only функции. Вряд ли конечно, но чем черт не шутит..В общем случае конечно можно полагаться на современные реализации и считать, что чтение потокобезопасно, но только чтение.

Цитата(Alexeis @  17.2.2011,  10:49 Найти цитируемый пост)
Если хоть кто-то пишет но ни какой потокобезопаности

Ну да. Такого вообще быть не может, ведь потокобезопасность контейнера здорово снижает его производительность. Никто не станет делать потокобезопасным все контейнеры. Максимум делают две версии.

Это сообщение отредактировал(а) azesmcar - 17.2.2011, 10:57
PM   Вверх
baldina
Дата 17.2.2011, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Код

CMyList::iterator it = begin();
    while (it != end())
    {
        if ((*it)->GetId()==qwId)
        {
            SAFEDEL(*it);
            erase(it);
            break;
        }
        it++;
    }




проще std::list::remove_if():

Код

remove_if ([&](CMyList::value_type& x){ 
 return x.GetId() == qwId; 
});

PM MAIL   Вверх
borisbn
Дата 17.2.2011, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



baldina, в твоём случае удаляться все элементы, а в варианте с while - только первый, т.к. там стоит break;





--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
alexvs11
Дата 17.2.2011, 15:42 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



Цитата(borisbn @  17.2.2011,  10:14 Найти цитируемый пост)
чевойта ?

это обозначает, что в многопоточной среде в условиях когда доступ к объектам stl'a идет раздельно ничего само не взорвется

Цитата

The SGI implementation of STL is thread-safe only in the sense that simultaneous accesses to distinct containers are safe, and simultaneous read accesses to to shared containers are safe. If multiple threads access a single container, and at least one thread may potentially write, then the user is responsible for ensuring mutual exclusion between the threads during the container accesses.

PM MAIL   Вверх
Abyx
Дата 17.2.2011, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



alexvs11, и какое нам дело до "The SGI implementation of STL" ?
PM MAIL   Вверх
azesmcar
Дата 17.2.2011, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



alexvs11

1. В visual C++ (по умолчанию) стоит dinkumware, а не SGI.
2. 
Цитата(alexvs11 @  17.2.2011,  15:42 Найти цитируемый пост)
The SGI implementation of STL is thread-safe only in the sense that simultaneous accesses to distinct containers are safe

это означает, что доступ к разным контейнерам, разными потоками безопасен (еще бы, только этого нам не хватало smile )

Цитата(alexvs11 @  17.2.2011,  15:42 Найти цитируемый пост)
and simultaneous read accesses to to shared containers are safe.

чтение общих контейнеров потокобезопасно, это гарантия реализации от SGI, тем не менее стандарт такой гарантии не дает.

Цитата(alexvs11 @  17.2.2011,  15:42 Найти цитируемый пост)
If multiple threads access a single container, and at least one thread may potentially write, then the user is responsible for ensuring mutual exclusion between the threads during the container accesses.

Вот он! Контейнер потокобезопасен для чтение, но не для записи. Если мы вернемся к исходнику в первом посте, мы увидем, что ТС пытается удалить элемент из контейнера, что никак нельзя назвать чтением.
PM   Вверх
borisbn
Дата 17.2.2011, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(alexvs11 @  17.2.2011,  15:42 Найти цитируемый пост)
что в многопоточной среде в условиях когда доступ к объектам stl'a идет раздельно ничего само не взорвется

и к std::istream ?
если говорить только о SLT-контейнерах, то понятно, что вызsвать функции для чтения можно из разных потоков, правда никто не гарантирует, что сами потоки не будут изменять содержимое. Например, если вызывать ф-цию begin() из разных потоков, то она гарантировано вернёт одно и то же, если же в самом потоке писать в этот инетратор, то ...
Код

void Thread1::run() {
    *vect->begin() = IntVect::value_type();
}
void Thread2::run() {
    IntVect::value_type x = *vect->begin();
}

так что говорить, что
Цитата(alexvs11 @  16.2.2011,  23:51 Найти цитируемый пост)
студийный stl должен быть потокобезопасным

некорректно

Цитата(alexvs11 @  17.2.2011,  15:42 Найти цитируемый пост)
The SGI implementation of STL

в студии используют Hewlett-Packard implementation, насколько я знаю.



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
alexvs11
Дата 17.2.2011, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



Цитата(alexvs11 @  17.2.2011,  00:25 Найти цитируемый пост)
еще в критических секция должны быть все куски кода, где идет доступ к его содержимому


Цитата(azesmcar @  17.2.2011,  15:59 Найти цитируемый пост)
Вот он! Контейнер потокобезопасен для чтение, но не для записи. Если мы вернемся к исходнику в первом посте, мы увидем, что ТС пытается удалить элемент из контейнера, что никак нельзя назвать чтением.


вы не поверите

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


uploading...
****


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

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



alexvs11

Заметье, я ничего не писал по поводу второго сообщения. Я возразил против первого. Или вы продолжаете утверждать, что студийная реализация STL потокобезопасна?
PM   Вверх
alexvs11
Дата 17.2.2011, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



Цитата(borisbn @  17.2.2011,  15:59 Найти цитируемый пост)
в студии используют Hewlett-Packard implementation, насколько я знаю.

они прародители стандартного стла, привык читать маны оттуда, согласен что он не является стандартным на текущий момент
http://www.sgi.com/tech/stl/
внизу подпись 
Цитата

Copyright © 1994
Hewlett-Packard Company

между прочем

Добавлено @ 16:11
Цитата(azesmcar @  17.2.2011,  16:03 Найти цитируемый пост)
Заметье, я ничего не писал по поводу второго сообщения. Я возразил против первого. Или вы продолжаете утверждать, что студийная реализация STL потокобезопасна?

я неправильно выразился, этим имел в виду, что если синхронизация правильная, то проблемы у автора, а не у stl'a
а в многопоточной среде бывает что и при синхронизации работает не так, взять тот же небезопасный CreateThread и безопасный _beginthread

Это сообщение отредактировал(а) alexvs11 - 17.2.2011, 16:13
PM MAIL   Вверх
mes
Дата 17.2.2011, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(borisbn @  17.2.2011,  09:14 Найти цитируемый пост)
много раз слышал это из разных источников, но не могу понять, почему именно ?

потому что исполнение стандартных контейнеров является логически финальной и расшить/изменить интерфейс не нарушив логической полноценности является трудно выполнимой задачей.. поэтому в общем случае их не рекомендует наследовать, особенно не приватно.. 



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


hell is here
**


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

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



кстати, методы контейнера ведь и не обязаны быть виртуальными, правильно я понимаю?  smile 
тогда это вообще лишает принципиального смысла наследование - подсунуть под указателем list уже не удастся, а схожесть интерфейса решится обычным делегированием

Это сообщение отредактировал(а) alexvs11 - 17.2.2011, 16:50
PM MAIL   Вверх
borisbn
Дата 17.2.2011, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(mes @  17.2.2011,  16:34 Найти цитируемый пост)
расшить/изменить интерфейс не нарушив логической полноценности является трудно выполнимой задачей.. 

а почему, если я добавлю в deque такие ф-ции
Код

T MyDeque::take_front() {
  T res = front();
  pop_front();
  return res;
}

T MyDeque::take_back() {
  T res = back();
  pop_back();
  return res;
}

я "нарушу локическую полноценность" ?
mes, если не сложно, можете на конкретном примере пояснить, почему же наследоваться от stl - не есть хорошо ? Объяснение "а вот тут ты сам можешь потом забыть и (не)использовать эту штуку" - принимаются. Спасибо.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
baldina
Дата 17.2.2011, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(borisbn @  17.2.2011,  15:09 Найти цитируемый пост)
baldina, в твоём случае удаляться все элементы, а в варианте с while - только первый, т.к. там стоит break;

да, так. хотя телепатия подсказала что break там скорее для оптимизации.
PM MAIL   Вверх
mes
Дата 17.2.2011, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Добавлено @ 17:11
перенесено в соответствующую тему.. 



Это сообщение отредактировал(а) mes - 17.2.2011, 19:07


--------------------
PM MAIL WWW   Вверх
alexvs11
Дата 17.2.2011, 17:19 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



borisbn, концептуально наследование должно использоваться для специализации одной сущности к другой, общему deque к конкретному MyDeque, так чтобы конкретный MyDeque мог использоваться как специализированный MyDeque и как общий deque
но тут возникают две концептуальные проблемы
1) стандартный deque не предназначен для специализации ( отсутствие виртуальных функций, protected полей итп ).
2) само отсутствие виртуальных функций делает невозможное использование вашего MyDeque как общего deque

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

Это сообщение отредактировал(а) alexvs11 - 17.2.2011, 17:20
PM MAIL   Вверх
mes
Дата 17.2.2011, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(alexvs11 @  17.2.2011,  16:19 Найти цитируемый пост)
 и связанность между классами будет меньше 

тут больше подходит не "связанность", а "сцепление" или "зависимость".. 


Это сообщение отредактировал(а) mes - 17.2.2011, 17:32


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


Эксперт
****


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

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



Цитата(mes @  17.2.2011,  17:10 Найти цитируемый пост)
и это оффтопик.. лучше заведите свою тему.. или хотя бы продолжите более подходящую.. 

согласен на 99,9(9). создал


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
baldina
Дата 17.2.2011, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



borisbn, есть признак: если деструктор не виртуальный, то класс не предназначен для наследования

Цитата(borisbn @  17.2.2011,  16:58 Найти цитируемый пост)
а почему, если я добавлю в deque такие ф-ции ... я "нарушу локическую полноценность" ?

а никто не говорил, что в данном случае что-то нарушится  smile 
в этих функциях ничего страшного нет: они бесполезны, т.к. не расширяют семантику класса.
а как только понадобится захочется создать действительно специализированную версию контейнера (путем наследования), начнутся проблемы: стандартные контейнеры не являются абстрактными классами с точки зрения языка: виртуальные функции использовать нельзя (деструктор невиртуальный), и функции доступа невиртуальные
с другой стороны, стандартные контейнеры являются АТД, и в этом смысле их расширять не требуется.
с третьей: если, скажем, нужно создать стек на основе списка, заимствуя при этом часть функций, технически удобно использовать наследование, но - закрытое. т.е. применить прием С++, не относящийся к ООП. кстати в stl стек так и сделан. 
еще пример: паттерны типа Facade и Adapter(Wrapper) решаются путем агрегирования или закрытого наследования, а полученный класс также не предназначен для наследования

Добавлено через 2 минуты и 27 секунд
Цитата(baldina @  17.2.2011,  18:38 Найти цитируемый пост)
кстати в stl стек так и сделан. 

ща поглядел, и вижу, что нет: стек агрегирует контейнер. а мне казалось я где-то видел закрытое наследование...
PM MAIL   Вверх
mes
Дата 17.2.2011, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



перенесено

Abyx, автор оффтопика уже создал отдельную тему... 


Это сообщение отредактировал(а) mes - 17.2.2011, 19:48


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


Опытный
**


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

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



Цитата(baldina @  17.2.2011,  19:38 Найти цитируемый пост)
есть признак: если деструктор не виртуальный, то класс не предназначен для наследования

лолшто?

вообще-то есть статический полиморфизм, aka CRTP, и местами его очень много.
PM MAIL   Вверх
alexvs11
Дата 17.2.2011, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



Цитата(Abyx @  17.2.2011,  19:39 Найти цитируемый пост)
лолшто?

в указанном примере не было речи о привлечении каких-либо дополнительных идиом
так что все в рамках приличия
PM MAIL   Вверх
ValeryLaptev
Дата 20.2.2011, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Препод



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

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



Цитата(borisbn @ 17.2.2011,  10:14)
Цитата(volatile @  17.2.2011,  00:22 Найти цитируемый пост)
А вообще наследовать от STL классов есть нехорошо.Лучше их включать в класс в качестве членов.

Цитата(volatile @  17.2.2011,  00:36 Найти цитируемый пост)
и наследовать от STL классов, еще раз, очень не рекомендуется.

volatile, много раз слышал это из разных источников, но не могу понять, почему именно ? Спасибо.

Цитата(alexvs11 @  16.2.2011,  23:51 Найти цитируемый пост)
студийный stl должен быть потокобезопасным

чевойта ?

Не рекомендуется наследовать, так как в стандартных контейнерах деструктор НЕ ЯВЛЯЕТСЯ ВИРТУАЛЬНЫМ.
PM MAIL   Вверх
mes
Дата 20.2.2011, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(ValeryLaptev @  20.2.2011,  10:16 Найти цитируемый пост)
 так как в стандартных контейнерах деструктор НЕ ЯВЛЯЕТСЯ ВИРТУАЛЬНЫМ. 

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


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 20.2.2011, 12:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(ValeryLaptev @  20.2.2011,  11:16 Найти цитируемый пост)
Не рекомендуется наследовать, так как в стандартных контейнерах деструктор НЕ ЯВЛЯЕТСЯ ВИРТУАЛЬНЫМ. 

Если только это, то это вообще не причина НЕ наследовать, это причина не удалять объект через указатель на базовый класс.
Для ясности: я не согласен с тем, что класс, который наследуется обязан иметь виртуальный деструктор. Я считаю, что класс, который имеет хоть одну виртуальную функцию, должен иметь виртуальный деструктор. Остальное должно решаться в зависимости от ситуации.

И кстати обсуждение переехало сюда.

Это сообщение отредактировал(а) azesmcar - 20.2.2011, 12:46
PM   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0884 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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