повышение, совместно использованный ptr По сравнению со слабым ptr? Чтобы использовать когда?

В моем текущем проекте я использую boost::shared_ptr вполне экстенсивно.

Недавно мои поддерживающие помощники команды также начали использовать weak_ptr. Я не знаю который использовать и когда.

Кроме этого, что я должен сделать, если я хочу преобразовать weak_ptr кому: shared_ptr. Делает ставить блокировку weak_ptr создать a shared_ptr влиять на мой код в другом потоке?

43
задан fduff 15 January 2016 в 14:34
поделиться

4 ответа

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

  • Анализ времени/шаблонов выполнения задач CPU для оптимизации (при необходимости повышения производительности).
  • Анализ других систем для решения проблем системной интеграции (например, какие сообщения передает и получает ваш блок VoIP при подключении к определенному одноранговому узлу?)
  • Понимание природы ошибок (для полевой диагностики)
  • Помощь в разработке
  • Помощь в валидационном тестировании

Я полагаю, что нет грандиозной единой теории каротажа, потому что то, что вы делаете, будет зависеть от многих деталей:

  • Количество данных
  • Тип данных
    • События
    • Потоковое аудио/видео
  • Доступно месту хранения
    • Скорость места хранения
    • Емкость места хранения
  • Доступные каналы для извлечения данных
    • Пропускная способность
    • Стоимость
    • Доступность
      • Подключение к Интернету 24 × 7
      • Сайтов Посещение требуется
      • Необходимо разблокировать ржавые ворота, подняться по лестнице на крышу, подключить кабель, после наполнять документации по ОТ, ТБ и ООС
      • Необходимо подождать, пока не закончится зима в Антарктике, и ледяные щиты оттаивают
  • Произвольный доступ против линейного доступа (например, если вы сжали его, нужно ли читать с начала, чтобы распаковать и получить доступ к некоторой случайной точке?)
  • Нужно ли пережить условия ошибки
    • Перезагрузка сторожевого журнала
    • Возможное повреждение данных
      • Из-за отказа поставки питания
      • Из-за ненадежного носителя мест хранения
      • Необходимо пережить авиакатастрофу

Что касается ASCII vs binary, я обычно предпочитаю сохранять простоту ведения журнала и помещать любую хорошую презентацию в приложение ПК, которое декодирует данные. Обычно проще создать удобную для пользователя презентацию в программном обеспечении ПК (например, Python), чем в самой встроенной системе.

-121--4378932-

Читайте о макетах объектов здесь
http://en.wikipedia.org/wiki/Mock_object
http://www.mockobjects.com/

И используйте этот python lib, чтобы издеваться над пользователем
http://python-mock.sourceforge.net/

иначе вы можете написать простой класс пользователя самостоятельно, использовать это как начало пункта

class MockUser(object):
    def __call__(self, *args, **kwargs):
        return self

    def __getattr__(Self, name):
        return self

добавить конкретные случаи и т.д.

-121--913373-

В целом,

Сильные указатели гарантируют их собственную действительность. Используйте их, например, когда:

  • Вы владеете объектом, на который указывают; создается и уничтожается
  • Не определено поведение, если объект не существует
  • Необходимо обеспечить его существование.

Слабые указатели гарантируют знание их собственной действительности. Используйте их, например, когда:

  • Вы получаете доступ к нему, но он не ваш.
  • Определено поведение, если объект не существует

Блокировка () на слабом указателе возвращает сильный указатель; вот как вы получаете доступ к слабому указателю.Если объект больше не является допустимым (он был удален и т.д.), то сильный указатель будет иметь значение NULL, в противном случае он будет указывать на объект. Вам нужно будет проверить это.

Он настроен таким образом, что вы не можете случайно удалить объект во время его использования, потому что вы сделали временный (локальный) сильный указатель, и, таким образом, гарантировал существование объекта, в то время как сильный указатель остается. По завершении использования объекта, как правило, сильный указатель выпадает из области действия (или переназначения его), что позволяет удалить объект. Для многопоточности, относитесь к ним с той же осторожностью, что и к другим вещам, которые не имеют встроенной безопасности потоков, отмечая, что гарантия, о которой я говорил выше , будет удерживаться при многопоточности. АФАИК они не делают ничего особенного в прошлом.

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

В других ответах также указаны рабочие характеристики и циклические зависимости.

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

70
ответ дан 26 November 2019 в 22:48
поделиться

В C все хранится в сегментах линейной памяти. Вы передаете адрес a [0] [0] , который будет таким же, как адрес a [0] , так что a [i] [j] совпадает с a [i * ColSize + j] , поскольку все хранится линейно. Но если распределять память динамически, это приведет к сбою, поскольку в это время все строки могут не храниться в смежном расположении. тогда a [i] [j] будет * (& a [i] + j) .

-121--2457463-

Дата создания, дата изменения и автор последнего изменения файла должны храниться в программном обеспечении системы управления версиями.

Обычно я ставлю:

  • Основное назначение файла и вещи в файле.
  • Проект/модуль, к которому принадлежит файл.
  • Лицензия, связанная с файлом (и файл LICENSE в корневом каталоге проекта).
  • Кто несет ответственность за файл (коллектив, человек или оба)
-121--2498558-

Используйте слабый _ ptr , когда создаваемые объекты содержат циклические ссылки, т.е. общий _ ptr на объект с общим _ ptr обратно к себе. Это происходит потому, что shared _ ptr не может обрабатывать циклические ссылки - когда оба объекта выходят из области действия, взаимная ссылка означает, что они не являются «собранными мусором», поэтому память теряется и происходит утечка памяти. Поскольку слабый _ ptr не увеличивает количество ссылок, циклическая проблема ссылок не возникает. Это также означает в общем случае, что если вы хотите просто взять указатель на что-то, что ссылка подсчитано и не хотите увеличить его количество ссылки, то используйте слабый _ ptr .

В противном случае можно использовать shared _ ptr .

Для получения дополнительной информации см. документацию по Boost .

23
ответ дан 26 November 2019 в 22:48
поделиться

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

Существует две причины использования слабая указателя:

  1. для устранения стоимости отсчета ссылок увеличение / уменьшение; Однако вы не должны делать это, потому что это подвержено ошибкам и на самом деле не сэкономит много времени
  2. в структурах данных по бухгалтерам, например, У вас есть индекс всех объектов FOO, которые являются «живыми», то есть где-то еще использовались, и вы не хотите держать Foo живой в индексе, если все «реальные» используются. Это основное реалистичное использование случая для слабых указателей. Конечно, другие существуют также.

Так что в целом, моя рекомендация будет использовать слабые указатели только тогда, когда вы знаете, что вы хотите позволить ссылающимся объектам быть удалены и хотите обнаружить это. В других случаях используйте общие указатели (счетные ссылки) или прямые указатели, особенно В методе локальные переменные, когда вы знаете, что объекты не будут удалены. Также ErrorProne, хотя, но быстрее, чем общие указатели.

N.B. Циклические объекты не нужны слабые указатели, вы можете использовать не приготовленные обычные указатели в наиболее правильно построенных программах. Слабые указатели менее рискованные, хотя.

6
ответ дан 26 November 2019 в 22:48
поделиться

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

-10
ответ дан 26 November 2019 в 22:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: