В моем текущем проекте я использую boost::shared_ptr
вполне экстенсивно.
Недавно мои поддерживающие помощники команды также начали использовать weak_ptr
. Я не знаю который использовать и когда.
Кроме этого, что я должен сделать, если я хочу преобразовать weak_ptr
кому: shared_ptr
. Делает ставить блокировку weak_ptr
создать a shared_ptr
влиять на мой код в другом потоке?
Вы можете «приборостроить» свой код различными способами, от событий запуска/выключения до выполнения отдельных машинных команд (с помощью эмулятора процессора). Что стоит сделать из всех возможностей? Не делайте этого просто ради полноты; иметь в виду конкретную цель. Бизнес-случай, если хотите, с выгодой, которую вы ожидаете получить. Например,
Я полагаю, что нет грандиозной единой теории каротажа, потому что то, что вы делаете, будет зависеть от многих деталей:
Что касается 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 позволяет не путать создание программы, но она не заменяет собой время, необходимое для правильного проектирования указателей, владения объектами и времени жизни. При наличии такой конструкции можно использовать библиотеку для ее применения. Если у вас нет такого дизайна, вы, скорее всего, столкнетесь с другими проблемами, чем раньше.
В C
все хранится в сегментах линейной памяти. Вы передаете адрес a [0] [0]
, который будет таким же, как адрес a [0]
, так что
a [i] [j]
совпадает с a [i * ColSize + j]
, поскольку все хранится линейно. Но если распределять память динамически, это приведет к сбою, поскольку в это время все строки могут не храниться в смежном расположении. тогда a [i] [j]
будет * (& a [i] + j)
.
Дата создания, дата изменения и автор последнего изменения файла должны храниться в программном обеспечении системы управления версиями.
Обычно я ставлю:
Используйте слабый _ ptr
, когда создаваемые объекты содержат циклические ссылки, т.е. общий _ ptr
на объект с общим _ ptr
обратно к себе. Это происходит потому, что shared _ ptr
не может обрабатывать циклические ссылки - когда оба объекта выходят из области действия, взаимная ссылка означает, что они не являются «собранными мусором», поэтому память теряется и происходит утечка памяти. Поскольку слабый _ ptr
не увеличивает количество ссылок, циклическая проблема ссылок не возникает. Это также означает в общем случае, что если вы хотите просто взять указатель на что-то, что ссылка подсчитано и не хотите увеличить его количество ссылки, то используйте слабый _ ptr
.
В противном случае можно использовать shared _ ptr
.
Для получения дополнительной информации см. документацию по Boost .
Общие указатели реализуют ссылочные подсчета, слабые указатели не влияют на ссылку, и если у вас нет общих указателей на объект, только слабые указатели, объект удаляется, и слабые указатели теперь говорят вам, что объект был потерян Отказ
Существует две причины использования слабая указателя:
Так что в целом, моя рекомендация будет использовать слабые указатели только тогда, когда вы знаете, что вы хотите позволить ссылающимся объектам быть удалены и хотите обнаружить это. В других случаях используйте общие указатели (счетные ссылки) или прямые указатели, особенно В методе локальные переменные, когда вы знаете, что объекты не будут удалены. Также ErrorProne, хотя, но быстрее, чем общие указатели.
N.B. Циклические объекты не нужны слабые указатели, вы можете использовать не приготовленные обычные указатели в наиболее правильно построенных программах. Слабые указатели менее рискованные, хотя.
Вы, вероятно, не должны пытаться использовать слабые указатели вообще, если вы не пытаетесь реализовать сборщик мусора, который не является горячей идеей в C ++, потому что слишком сложно отслеживать все, что может пойти не так достаточно близко.