Когда boost :: shared_ptr не может быть освобожден? - PullRequest
2 голосов
/ 09 февраля 2011

После прочтения этой темы C ++ подготовка к собеседованию (Ответ Мэтта) У меня есть вопрос о boost :: shared_ptr. Реально ли для shared_ptr утечка памяти? Как?

Ответы [ 3 ]

3 голосов
/ 09 февраля 2011

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);
  • выделенный циклоприемник ;
  • в качестве крайней меры, вручную обнуляя указатели в соответствующих точках (это нарушает безопасность исключений).
1 голос
/ 09 февраля 2011

Циркулярные ссылки;распространенная проблема при подсчете ссылок сборщиками мусора.

Я предлагаю вам прочитать следующее: http://www.codeproject.com/KB/stl/boostsmartptr.aspx#Cyclic Ссылки

0 голосов
/ 09 февраля 2011

shared_ptr - это механизм подсчета ссылок. Одна вещь с подсчетом ссылок - вы можете иметь круговую цепочку ссылок, на которую больше никто не ссылается. Ваша цепь никогда не освободится, если не будет механизма «разорвать цепь».

...