shared_ptr
использует счетчик ссылок, а это означает, что циклические ссылки могут вызвать утечку.Конкретно:
struct A {
shared_ptr<A> other;
};
shared_ptr<A> foo() {
shared_ptr<A> one(new A);
shared_ptr<A> two(new A);
one->other = two;
two->other = one;
return one;
}
структура данных, возвращаемая foo
, никогда не будет освобождена без ручного вмешательства (установите любой из указателей other
в NULL).
Теперь это простофакт, который должен знать каждый программист;тем интереснее разговор на собеседовании, что с этим делать.Возможные варианты:
- изменение структуры данных таким образом, чтобы циклы указателей не требовались;
- понижение хотя бы одного указателя в каждом цикле на не принадлежащую ссылку (пустой указатель или
weak_ptr
); - выделенный циклоприемник ;
- в качестве крайней меры, вручную обнуляя указатели в соответствующих точках (это нарушает безопасность исключений).