Как обнаружить циклы при использовании shared_ptr

Вы объявляете класс с помощью метода, что неправильно

Вам необходимо понять, что на самом деле означают класс и метод (Google Java OOP):

1- Вы должны создайте класс и объявите переменные, которые вы хотите

2- создайте конструкторы для значений по умолчанию

3- сделайте установщики, чтобы установить (назначить) эти значения

4- сделайте геттеры читать эти значения

21
задан Unknown 22 April 2009 в 21:20
поделиться

8 ответов

Я не нашел гораздо лучшего метода, чем рисование больших UML-графиков и поиск циклов.

Для отладки я использую счетчик экземпляров, идущий в реестр, например так:

template <DWORD id>
class CDbgInstCount
{
public:
#ifdef _DEBUG
   CDbgInstCount()   { reghelper.Add(id, 1); }
   CDbgInstCount(CDbgInstCount const &) {  reghelper.Add(id, 1); }
   ~CDbgInstCount()  { reghelper.Add(id, -1); }
#else
#endif
};

Мне просто нужно добавить это к рассматриваемым классам, и посмотрите на реестр.

(Идентификатор, если дано, например, 'XYZ!', будет преобразован в строку. К сожалению, вы не можете указать строковую константу в качестве параметра шаблона )

3
ответ дан 29 November 2019 в 06:52
поделиться

shared_ptr представляет право собственности отношение. В то время как слабый_птр представляет осведомленность . Наличие нескольких объектов, владеющих друг другом, означает, что у вас есть проблемы с архитектурой, которая решается путем замены одного или нескольких собственных на с учетом (то есть, weak_ptr s).

Я не понимаю, почему предложение weak_ptr считается бесполезным.

25
ответ дан 29 November 2019 в 06:52
поделиться

Довольно просто обнаружить циклы:

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

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

4
ответ дан 29 November 2019 в 06:52
поделиться

Может быть, комбинация boost :: weak_ptr и boost :: shared_ptr ? Эта статья может представлять интерес.

2
ответ дан 29 November 2019 в 06:52
поделиться

See this post on detecting cycles in a graph.

1
ответ дан 29 November 2019 в 06:52
поделиться

Общее решение найти цикл можно найти здесь:

Лучший алгоритм для проверки того, имеет ли связанный список цикл

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

1
ответ дан 29 November 2019 в 06:52
поделиться

I know you said "no weak_ptr" but why not? Having your head with a weak_ptr to tail, and tail with a weak_ptr to head will prevent the cycle.

-1
ответ дан 29 November 2019 в 06:52
поделиться

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

Вы конкретно спрашиваете, как вы заметили циклические ссылки. Дело в том, что в сложном проекте некоторые ссылочные циклы являются косвенными и их трудно обнаружить.

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

Вы должны четко понимать, какие указатели являются владельцами, а какие - наблюдателями.

Для владельцев используйте shared_ptr

Для наблюдателей используйте weak_ptr - все они, а не только те, которые, по вашему мнению, могут быть частью цикла. Конечно, вам нужно будет написать много кода для преобразования всех этих weak_ptr в shared_ptrs, когда вы захотите их использовать - Boost действительно не подходит для этой работы.

18
ответ дан 29 November 2019 в 06:52
поделиться
Другие вопросы по тегам:

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