Arhn - архитектура программирования

Стандартное решение С++ 11. shared_ptr(const weak_ptr‹Y›& r)

Какого черта ? (настоящий вопрос выделен жирным шрифтом после цитаты)

§ 20.7.2.2.1

template<class Y> explicit shared_ptr(const weak_ptr<Y>& r);
23 Требуется: Y* должно быть конвертировано в T*. 24 Эффекты: Создает объект shared_ptr, который разделяет владение с r и сохраняет копию указателя, хранящегося в r.
25 Постусловия: use_count() == r.use_count().
26 Выдает: bad_weak_ptr когда r.expired().
27 Безопасность исключений. Если возникает исключение, конструктор не действует.

Это не поведение повышения. Общий ресурс, созданный из слабого объекта с истекшим сроком действия, дает пустой общий ресурс. И вы можете проверить это в логических контекстах.

Почему комитет пошел по пути исключений? Например, рекомендации Google C++ полностью исключают использование исключений. Как будут работать проекты с такими рекомендациями или даже исключениями, отключенными во время сборки (в компиляторах, которые разрешают отключение)?

Наконец, не может ли он быть опасно медленным (для программ реального времени), если это, возможно, происходит часто (разработчик полагается на обнаружение указателей с истекшим сроком действия как на нормальный поток программы)? Я помню статью, в которой упоминались две возможные стратегии реализации исключений: одна замедляла все, но не когда происходили исключения, другая замедляла только тогда, когда происходили исключения, но не мешала остальным. Я предполагаю, что в какой-то степени это все еще верно.


  • Если вы никогда не хотите использовать исключения, в стандартной библиотеке вам доступно очень мало. Вам нужно будет найти другую библиотеку. К счастью, C++ — отличная платформа для разработки библиотек, и я уверен, что такие есть. 06.12.2013
  • boost::shared_ptr также выдает исключение при построении из weak_ptr с истекшим сроком действия, как это делает std::shared_ptr: boost.org/doc/libs/1_55_0/libs/smart_ptr/ (expired() эквивалентно use_count() == 0). 06.12.2013
  • @JoshTownzen: разве use_count не была своего рода буги-функцией, которую мы не должны были использовать? Я вижу, что это стало официальным в стандарте. В любом случае инвариант понятен. Остается только одно: use_count может быть устаревшим (не потокобезопасным). 06.12.2013

Ответы:


1

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

Если вы не хотите иметь дело с исключениями, создайте его как

shared_ptr<T> p{r.lock()}; 

Это создаст пустой shared_ptr, если r.expired() == true

06.12.2013
  • На моем, это так? Затем, я думаю, я полностью запутался, получая метод shared_ptr из .lock() (который я, вероятно, всегда использовал); и создание shared_ptr из weak_ptr. Потом я подумал, что стандарт изменил мой маленький комфорт и испугался, когда на самом деле ничего не изменилось. ответ принят. 06.12.2013
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..